Node.js 便利ツール

utilモジュールは Node.js の組み込みモジュールであり、JavaScript プログラミングにおけるデバッグ、エラー処理、フォーマットなどの機能をサポートする実用的なユーティリティ関数が含まれています。

utilよく使われる関数のコレクションを提供し、コア JavaScript の機能が簡素すぎる不足を補います。

utilモジュールの機能は、オブジェクトの検査、継承、文字列のフォーマットなど、多岐にわたります。

util モジュールのインポート

まず、util モジュールをインポートする必要があります:

const util = require('util');

よく使われるメソッド:

メソッド説明
util.format(format, ...args)文字列をフォーマットし、%s、%d、%jプレースホルダーをサポートします。
util.inspect(object[, options])オブジェクトを文字列に変換し、デバッグに使用します。
util.promisify(function)コールバック形式の関数を、Promise を返す関数に変換します。
util.callbackify(fn)Promise を返す関数を、コールバック形式の関数に変換します。
util.inherits(constructor, superConstructor)あるコンストラクタに、別のコンストラクタのプロトタイプメソッドを継承させます。
util.deprecate(fn, message)関数を非推奨としてマークし、呼び出し時に警告メッセージを出力します。
util.typesさまざまな型検出メソッドを含むコレクションです。例えば、isAnyArrayBuffer、isBigInt64Array。
util.isDeepStrictEqual(val1, val2)2つの値が深く等しいかどうかを判定します。ディープ比較に似ています。
util.getSystemErrorName(err)エラーコードに基づいてシステムエラー名を返します。
util.inspect.customSymbol であり、カスタムのinspect動作を定義でき、デバッグに使用します。

util.types の型検出メソッド

util.types は、JavaScript の typeof と instanceof を拡張した、多くの型検出メソッドを含むコレクションです。

メソッド説明
util.types.isAnyArrayBuffer(value)値がArrayBuffer 或 SharedArrayBuffer。
util.types.isArrayBuffer(value)値がArrayBuffer。
util.types.isAsyncFunction(value)値が非同期関数であるかどうかをチェックします。
util.types.isBigInt64Array(value)値がBigInt64Array。
util.types.isBigUint64Array(value)値がBigUint64Array。
util.types.isBooleanObject(value)値が Boolean オブジェクトであるかどうかをチェックします。
util.types.isDataView(value)値がDataView。
util.types.isDate(value)値がDate。
util.types.isGeneratorFunction(value)値がジェネレータ関数であるかどうかをチェックします。
util.types.isMap(value)値がMap。
util.types.isSet(value)値がSet。
util.types.isRegExp(value)値が正規表現であるかどうかをチェックします。
util.types.isSymbolObject(value)値が Symbol オブジェクトであるかどうかをチェックします。

適用例

util.format() - 文字列フォーマット

util.format() はフォーマット済み文字列を生成するために使用され、%s、%d、%j などのプレースホルダーをサポートします。これらはそれぞれ文字列、数値、JSON を表します。

例

const util = require('util');
const name = 'Alice';
const age = 25;
console.log(util.format('Name: %s, Age: %d', name, age));  // 出力: Name: Alice, Age: 25

util.promisify() - コールバック関数を Promise に変換

util.promisify() は、従来のコールバック形式の関数を Promise を返す関数に変換し、async/await と一緒に使用できるようにします。

例

const util = require('util');
const fs = require('fs');

// コールバック形式の fs.readFile を Promise を返す関数に変換する
const readFileAsync = util.promisify(fs.readFile);

(async () => {
  try {
    const data = await readFileAsync('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
})();

util.callbackify() - Promise をコールバックに変換

util.callbackify() は、Promise を返す関数をコールバック形式の関数に変換し、コールバックが必要なコード環境で使用しやすくします。

util.callbackify(original) 将 async非同期関数(または戻り値がPromiseである関数)を、例外優先のコールバック形式の関数に変換します。例えば、(err, value) => ...コールバックを最後のパラメータとして受け取ります。 コールバック関数では、最初のパラメータが拒否の理由(もしPromise解決された場合はnull)、2番目のパラメータは解決された値です。

例

const util = require('util');

async function fn() {
  return 'hello world';
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  if (err) throw err;
  console.log(ret);
});

上記のコードの出力結果は次のとおりです:

hello world

コールバック関数は非同期に実行され、例外スタックのエラートレースが行われます。コールバック関数が例外をスローすると、プロセスは 'uncaughtException' 例外をトリガーし、捕捉されない場合はプロセスは終了します。

null はコールバック関数のパラメータとして特別な意味を持ちます。コールバック関数の最初のパラメータが Promise の拒否理由であり、戻り値を伴い、その値がブール値 false に変換できる場合、その値は Error オブジェクトにラップされ、属性 reason を通じて取得できます。

function fn() {
  return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  // 当 Promise 被以 `null` 拒绝时,它被包装为 Error 并且原始值存储在 `reason` 中。
  err && err.hasOwnProperty('reason') && err.reason === null;  // true
});

original は async 非同期関数です。この関数は従来のコールバック関数を返します。

util.deprecate() - 関数を非推奨としてマーク

util.deprecate() は非推奨の関数をマークするために使用され、呼び出し時に警告メッセージが表示されます。

例

const util = require('util');

const oldFunction = util.deprecate(() => {
  console.log('This function is deprecated');
}, 'oldFunction is deprecated. Use newFunction instead.');

oldFunction();  // 呼び出し時に警告が表示される

util.types - データ型の検出

util.types は、特定のデータ型を検出するためのメソッド群を提供し、typeof と instanceof の機能を拡張します。

例

const util = require('util');
console.log(util.types.isDate(new Date()));  // true
console.log(util.types.isMap(new Map()));    // true

util.inherits

util.inherits(constructor, superConstructor)は、オブジェクト間のプロトタイプ継承を実装する関数です。

JavaScript のオブジェクト指向の特性はプロトタイプベースであり、一般的なクラスベースとは異なります。JavaScript はオブジェクト継承の言語レベルの機能を提供しておらず、プロトタイプの複製によって実現されています。

ここでは util.inherits の使い方のみを紹介します。例は次のとおりです:

var util = require('util'); 
function Base() { 
    this.name = 'base'; 
    this.base = 1991; 
    this.sayHello = function() { 
    console.log('Hello ' + this.name); 
    }; 
} 
Base.prototype.showName = function() { 
    console.log(this.name);
}; 
function Sub() { 
    this.name = 'sub'; 
} 
util.inherits(Sub, Base); 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub); 

基本オブジェクト Base と、Base を継承する Sub を定義しました。Base にはコンストラクタ内で定義された3つのプロパティと、プロトタイプで定義された1つの関数があります。util.inherits によって継承を実現します。実行結果は次のとおりです:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

注意:Sub は、Base がプロトタイプで定義した関数のみを継承しており、コンストラクタ内で作成された base プロパティと sayHello 関数は Sub に継承されません。

また、プロトタイプで定義されたプロパティは、console.log によってオブジェクトのプロパティとして出力されません。objSub.sayHello(); の行のコメントを外すと、次のようになります:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
TypeError: Object #<Sub> has no method 'sayHello' 
at Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

注意:ES6 が登場する前は、util.inherits は Node.js で継承を実現する主要な方法でした。しかし、ES6 以降は class と extends 構文の使用が推奨されており、継承コードがより読みやすくなります。

util.inspect() - オブジェクト構造の出力

util.inspect(object[, options]):オブジェクトを文字列表現に変換し、デバッグに便利です。

util.inspect() はオブジェクトを文字列形式に変換します。デバッグでよく使用され、オブジェクトの詳細な構造やプロパティを確認できます。options パラメータを指定して出力形式を制御できます。

例


const obj = { a: 1, b: 2, c: { d: 3 } };
console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));

util.isArray(object)

指定されたパラメータ "object" が配列の場合は true を返し、それ以外の場合は false を返します。

var util = require('util');

util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

util.isRegExp(object)

指定されたパラメータ "object" が正規表現の場合は true を返し、それ以外の場合は false を返します。

var util = require('util');

util.isRegExp(/some regexp/)
  // true
util.isRegExp(new RegExp('another regexp'))
  // true
util.isRegExp({})
  // false

util.isDate(object)

指定されたパラメータ "object" が日付の場合は true を返し、それ以外の場合は false を返します。

var util = require('util');

util.isDate(new Date())
  // true
util.isDate(Date())
  // false (without 'new' returns a String)
util.isDate({})
  // false

詳細については、http://nodejs.org/api/util.htmlをご覧ください。

その他の拡張