Node.js Util

8805 ワード

utilはNode.jsのコアモジュールであり、コアJavaScript機能があまりにも簡素化されていないことを補うために、常用関数のセットを提供している.utilモジュール設計の主な目的はNode.js内部APIの需要を満たすためである.
const util = require("util");
Node.jsのutilモジュールは、文字列をフォーマットし、対象を文字列に変換し、対象のタイプをチェックし、出力ストリームに対する同期書き込みを実行し、オブジェクトの継承を強化する実用的な関数を提供する.
フォーマット文字列format文字列の処理には通常、文字列の高速フォーマットが必要であり、Node.jsはutilモジュールで文字列のフォーマットを処理するための基本的な文字列フォーマット方法を提供しています.
util.format(format, [...])
util.form()関数は、最初のパラメータとしてフォーマット文字列formatを受信し、書式設定された文字列を返します.
formatパラメータは、ゼロまたは複数のプレースホルダを含む文字列で、各プレースホルダは1%の文字で始まり、最終的には対応するパラメータに変換された文字列値に置き換えられます.
プレースホルダ
説明
%s
文字列を指定
%d
数値を指定
%j
JSONを文字列に変換できるオブジェクトを指定します.
%o
Objectには、列挙できない属性が含まれています.
%O
Objectには、列挙できない属性が含まれていません.
%
%の後に空のままであればプレースホルダとしません.
%
出力%
format関数を使うときは注意が必要です.
  • パラメータがプレースホルダなしでは、余分なプレースホルダは置換されません.
    console.log(util.format("%s = %s", "alice"));//alice = %s
    
  • は、プレースホルダよりも多くのパラメータがある場合、余分なパラメータを文字列に変換し、スペース区切り記号で接続します.
  • console.log(util.format("%s = %s", "name", "alice", 18));//name = alice 18
    
  • は、最初のパラメータが文字列をフォーマットしていない場合、各パラメータを文字列に変換し、スペース区切り記号を使って接続し、接続後の文字列を返します.
  • console.log(util.format(1,2,3));//1 2 3
    
    オブジェクト変換文字列inspect
    util.inspect(object, [showHidden], [depth], [colors])
    util.inspect(object[, options])
    
    inspectは、任意のオブジェクトを文字列に変換する方法で、デバッグとエラー出力に使用されます.これは少なくとも一つのパラメータobjectを受け入れると、変換が必要なオブジェクトです.
    function Klass(){
        this.name = "alice";
        this.toString = function(){
            return this.name;
        }
    }
    const obj = new Klass();
    console.log(util.inspect(obj));//Klass { name: 'alice', toString: [Function] }
    
    パラメータ
    説明
    object
    変換するオブジェクト
    show Hdden
    オプションとして、エニュメレート・オブジェクトの隠し属性を表します.デフォルトのfalseは、trueであれば、より多くの隠し情報を出力します.
    depth
    オプションとして、最大再帰層数を表します.すなわち、オブジェクトのエニュメレート・明示的な深さを設定します.デフォルトでは2です.nullとして指定されている場合は、再帰層数を制限せずに完全に巡回します.
    colors
    オプションとして、colorsはtrueであり、出力フォーマットはANSI色で符号化され、端末表示のために使用される.
    例えば、オブジェクトが文字列に変換され、明示的に情報を隠します.
    console.log(util.inspect(obj, true));
    
    Klass {
      name: 'alice',
      toString:
       { [Function]
         [length]: 0,
         [name]: '',
         [arguments]: null,
         [caller]: null,
         [prototype]: { [constructor]: [Circular] } } }
    
    例えば、JSONオブジェクトは文字列を回転します.
    const obj = {id:1, name:"alice"}
    console.log(util.inspect(obj, true));//{ id: 1, name: 'alice' }
    
    同期書込み出力ストリーム
    utilモジュールは、標準入力stdoutと標準エラーstderに同期してデータを書き込む能力を有し、プロセスがデータが書き出されるまでブロックされることを意味する.現在のデータが書き込まれていることを確認するために使用できますが、システムはその動作を変更していません.
    関数
    説明
    util.debug(string)
    標準エラーstderに文字列を書き込み、古いものはconsosone.error()で代用します.
    util.error([...])
    複数のパラメータを受け入れて、標準エラーsterに書き込みます.もう古い時には、consolie.error()を使って代用します.
    util.puts(…)
    複数のパラメータを受け入れて標準出力stdoutに書き込みます.古いものはconsolone.log()で置き換えられます.
    util.print(…)
    複数のパラメータを受け入れて文字列に変換し、標準出力stdoutに書き込みます.
    util.log(string)
    文字列とタイムスタンプを標準出力stdoutに書き込みます.
    コンソール標準出力util.log
    util.log(string)
    
    logメソッドは、コンソール標準でstdoutを出力するときにタイムスタンプが付いています.
    util.log("hello world");//21 Dec 12:42:07 - hello world
    
    デバッグ出力util.debuglog
    util.debuglog(section)
    
    debuglog方法はNODE_によるものです.DEBUG環境変数は、debug情報を選択的に出力します.
    検査対象の種類
    オブジェクトの種類を判断する最も一般的な方法は、instance of演算子を使用して、utilモジュールは、一般的な便利な関数を提供します.
    console.log([] instanceof Array);//true
    
    判定関数
    説明
    util.isAray(object)
    与えられたオブジェクトが行列かどうかを判断します.
    util.isDate(object)
    与えられたオブジェクトが日付であるかどうかを判断します.
    util.isReg Exp(object)
    与えられたオブジェクトが正則かどうかを判断します.
    util.isError(object)
    与えられたオブジェクトがエラーであるかどうかを判断します.
    オブジェクトが行列util.isArrayかどうかをチェックします.
    util.isArray(object)
    
    isarray方法は、着信先のobjectが配列であるかどうかを確認し、ブール値に戻り、trueがfalseであるかどうかを調べるために使用される.
    console.log(util.isArray([]));//true
    console.log(util.isArray(new Array));//true
    console.log(util.isArray({}));//false
    
    チェック対象がDateタイプかどうかutil.isDate
    util.isDate(object)
    
    isDate方法は、入力されたオブジェクトのobjectがDate日付タイプであるかどうかを確認し、ブール値を返します.trueがfalseであるかどうかを確認します.
    console.log(util.isDate({}));//false
    console.log(util.isDate(new Date()));//true
    console.log(util.isDate(Date()));//false
    
    オブジェクトがErrerタイプかどうかを確認するutil.isError.
    util.isError(object)
    
    ISErr方法は、オブジェクトがErrタイプかどうかを確認し、ブール値を返します.trueがfalseであるかどうかを確認します.
    console.log( util.isError({name:"Error", message:"an error occurred"}) );//false
    console.log( util.isError(new Error()) );//true
    console.log( util.isError(new TypeError()) );//true
    
    オブジェクトが正規表現であるかどうかを確認するutil.isRegExp.
    util.isRegExp(object)
    
    isRegExp方法は、与えられたオブジェクトのobjetがRegExp正規表現であるかどうかを確認し、ブール値を返します.trueがfalseであるかどうかを確認します.
    console.log( util.isRegExp({}) );//false
    console.log( util.isRegExp(/regexp rule/) );//true
    console.log( util.isRegExp(new RegExp("pattern")) );//true
    
    オブジェクトプロトタイプ引継ぎutil.inheritsinheits法はオブジェクト間のプロトタイプ継承を実現するために用いられ、JavaScriptのオブジェクト指向特性はプロトタイプに基づいており、ベースクラスとは異なる.JavaScriptでは対象継承の言語レベル特性が提供されておらず、プロトタイプコピーにより実現されます.
    util.inherits(constructor, superConstructor)
    
    inheits法は他のオブジェクトからプロトタイプのプロトタイプを継承する方法のオブジェクトを作成することを可能にする.新しいオブジェクトを作成すると、プロトタイプのプロトタイプ方法が自動的に使用されます.
    const util = require("util");
    //  
    function Base(opts){
        //      
        this.id = opts.id || 0;
        this.name = opts.name || "";
        //      
        this.output = function(){
            console.log(this.id, this.name);
        };
    }
    //      
    Base.prototype.getName = function(){
        return this.name;
    };
    
    //  
    function Sub(opts){
        //        
        Base.call(this, opts)
        //          
        this.name = "subname";
        //        
        this.type = opts.type||"";
    }
    //      
    util.inherits(Sub, Base);
    
    
    //      
    const sub = new Sub({id:1, type:"subtype"});
    console.log(sub);//Sub { id: 1, name: 'subname', output: [Function], type: 'subtype' }
    
    //          
    console.log(sub.getName());//subname
    
    新しいオブジェクトが作成されたときにプロトタイプのconstructorを実行し、constructor.super_属性を使用してカスタマイズされたオブジェクトのコンストラクタから父類コンストラクタにアクセスすることができます.
    例えば、inheits方法を使用して、events.EventEmitterイベントフリップフロップオブジェクトの構造関数を継承して、Writable書き込みストリームを作成します.
    const util = require("util");
    const EventEmitter = require("events").EventEmitter;
    
    //   
    function Writer(){
        EventEmitter.call(this);
    }
    //    
    util.inherits(Writer, EventEmitter);
    //                
    Writer.prototype.write = function(data){
        this.emit("data", data);
    };
    
    //     
    const writer = new Writer();
    //            
    console.log(writer instanceof EventEmitter);//true
    
    // writer  data  
    writer.on("data", function(data){
        console.log("receive data:", data);//receive data: hello world
    });
    
    //       data  
    writer.write("hello world");
    
    console.log(writer);
    Writer {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined }
    
    スタイル変換util.promisifyNode.jsのコールバック関数は、約束に従って統一された形式、すなわち(error, value) => {}を有する.このようなコールバック関数はパラメータの関数としてPromiseを返す関数に変換することができる.
    例えば、async/awaitと連携してutil.promisifyを使ってファイルの内容を非同期的に読み取る.
    const util = require("util");
    const fs = require("fs");
    
    const asyncReadFile = util.promisify(fs.readFile);
    
    async function main(file, charset = "utf-8"){
        const content = await asyncReadFile(file, charset);
        //console.log(content);
        return content;
    }
    
    main("./README.md").then(data=>{
        console.log(data);
    });
    
    例えば、フォルダ統計情報の取得
    const util = require("util");
    const fs = require("fs");
    
    const stats = util.promisify(fs.stat);
    
    async function main(dirname){
        const content = await stats(dirname);
        //console.log(content);
        return content;
    }
    
    main(".").then(data=>{
        console.log(data);
    }).catch(error=>{
        console.log(error);
    });
    
    Stats {
      dev: 1650279073,
      mode: 16822,
      nlink: 1,
      uid: 0,
      gid: 0,
      rdev: 0,
      blksize: undefined,
      ino: 9007199255333340,
      size: 0,
      blocks: undefined,
      atimeMs: 1576835786059.209,
      mtimeMs: 1576835772463.417,
      ctimeMs: 1576835772463.417,
      birthtimeMs: 1576232793857.817,
      atime: 2019-12-20T09:56:26.059Z,
      mtime: 2019-12-20T09:56:12.463Z,
      ctime: 2019-12-20T09:56:12.463Z,
      birthtime: 2019-12-13T10:26:33.858Z }