util は、コア JavaScript 関数の簡素化の不足を補うために、一般的に使用される関数のコレクションを提供する Node.js コア モジュールです。
使用方法は次のとおりです。
const util = require('util');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
});
オリジナルは async 非同期関数です。 この関数は従来のコールバック関数を返します。
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 つのプロパティとプロトタイプで定義された関数があり、継承は 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)
util.inspect(object,[showHidden],[ Depth],[colors]) は、通常はデバッグとエラー出力のために、任意のオブジェクトを文字列に変換するメソッドです。 少なくとも 1 つの引数オブジェクト (変換するオブジェクト) を取ります。
showHidden はオプションのパラメータです。値が true の場合、さらに多くの非表示情報が出力されます。
深さは再帰レイヤーの最大数を表します。オブジェクトが複雑な場合は、レイヤーの数を指定して出力情報の量を制御できます。 深さが指定されていない場合、デフォルトで 2 レベルが再帰され、null を指定すると、再帰レベルの数に制限なくオブジェクトが完全に走査されることを意味します。 Colors が true の場合、出力形式は ANSI 色分けされます。これは通常、端末でより美しい効果を表示するために使用されます。
特に、util.inspect はオブジェクトを単純に文字列に直接変換しません。オブジェクトが toString メソッドを定義している場合でも、そのメソッドは呼び出されません。
var util = require('util');
function Person() {
this.name = 'byvoid';
this.toString = function() {
return this.name;
};
}
var obj = new Person();
console.log(util.inspect(obj));
console.log(util.inspect(obj, true));
操作の結果は次のようになります:
Person { name: 'byvoid', toString: [Function] }
Person {
name: 'byvoid',
toString:
{ [Function]
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular] } } }
指定された引数「object」が配列の場合は true を返し、それ以外の場合は false を返します。
var util = require('util');
util.isArray([])
// true
util.isArray(new Array)
// true
util.isArray({})
// false
指定された引数「object」が正規表現の場合は true を返し、それ以外の場合は false を返します。
var util = require('util');
util.isRegExp(/some regexp/)
// true
util.isRegExp(new RegExp('another regexp'))
// true
util.isRegExp({})
// false
指定された引数「object」が日付の場合は true を返し、それ以外の場合は false を返します。
var util = require('util');
util.isDate(new Date())
// true
util.isDate(Date())
// false (without 'new' returns a String)
util.isDate({})
// false