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.custom | Symbol であり、カスタムの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 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 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番目のパラメータは解決された値です。
例
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 oldFunction = util.deprecate(() => {
console.log('This function is deprecated');
}, 'oldFunction is deprecated. Use newFunction instead.');
oldFunction(); // 呼び出し時に警告が表示される
util.types - データ型の検出
util.types は、特定のデータ型を検出するためのメソッド群を提供し、typeof と instanceof の機能を拡張します。
例
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をご覧ください。
その他の拡張