Like Share Discussion Bookmark Smile

J.J. Huang   2020-01-29   Node.js   瀏覽次數:

Node.js | Util(常用工具)

簡介

util模組主要旨在滿足Node.js自己內部API的需求。但是,許多實用程序對應用程序和模組開發人員也很有用。

可以使用以下指令訪問它:

1
const util = require('util');

註:詳細Doc Link

util.callbackify

  • original <功能>的async功能
  • 返回:回調樣式函數

接受一個async函數(或Promise返回的函數)並按照錯誤優先的回調樣式返回函數,即以(err, value) => ...回調作為最後一個參數。在回調中,第一個參數將是拒絕原因(或null如果已Promise解決),第二個參數將是已解決的值。

1
2
3
4
5
6
7
8
9
10
11
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);
});

執行結果如下:

1
2
$ node main.js
hello world

回調是異步執行的,並且將具有有限的堆棧跟踪。如果引發了回調,則進程將發出一個'uncaughtException'事件,如果未處理,則退出。

由於null作為回調的第一個參數具有特殊含義,因此如果包裝函數拒絕將Promisea的值為偽造的a值,則該值將被包裝為in Error,原始值存儲在名為的字段中reason

1
2
3
4
5
6
7
8
9
10
11
12
const util = require('util');

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
});

util.inherits

util.inherits(constructor, superConstructor)是一個實現對象間原型繼承的函數。

JavaScript的面向對象特性是基於原型的,與常見的基於類的不同。
JavaScript沒有提供對象繼承的語言級別特性,而是通過原型複制來實現的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);

執行結果如下:

1
2
3
4
5
6
$ node main.js
base
Hello base
Base { name: 'base', base: 1991, sayHello: [Function] }
sub
Sub { name: 'sub' }

註:Javascripter 必須知道的繼承 prototype

注意,Sub僅僅繼承了Base在原型中定義的函數,而構造函數內部創造的base屬性和sayHello函數都沒有被Sub繼承。

同時,在原型中定義的屬性不會被console.log作為對象的屬性輸出。
如果我們去掉objSub.sayHello();這行的註釋。

執行結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ node main.js
base
Hello base
Base { name: 'base', base: 1991, sayHello: [Function] }
sub
/Users/morose/Documents/Temp/Example/main.js:28
objSub.sayHello();
^

TypeError: objSub.sayHello is not a function
at Object.<anonymous> (/Users/morose/Documents/Temp/Example/main.js:28:8)
at Module._compile (internal/modules/cjs/loader.js:956:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)
at internal/main/run_main_module.js:17:11

util.inspect

util.inspect(object,[showHidden],[depth],[colors])是一個將任意對象轉換為字符串的方法,通常用於調試和錯誤輸出。它至少接受一個參數object,即要轉換的對象。

showHidden是一個可選參數,如果值為true,將會輸出更多隱藏訊息。

depth表示最大遞歸的層數,如果對像很複雜,你可以指定層數以控制輸出訊息的多少。如果不指定depth,默認會遞歸2層,指定為null表示將不限遞歸層數完整遍歷對象。如果colors值為true,輸出格式將會以ANSI顏色編碼,通常用於在終端顯示更漂亮的效果。

特別要指出的是,util.inspect並不會簡單地直接把對象轉換為字符串,即使該對象定義了toString方法也不會調用。

1
2
3
4
5
6
7
8
9
10
11
12
13
var util = require('util');

function Person() {
this.name = 'byMorose';
this.toString = function() {
return this.name;
};
};

var obj = new Person();

console.log(util.inspect(obj));
console.log(util.inspect(obj, true));

執行結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
$ node main.js
Person { name: 'byMorose', toString: [Function] }
Person {
name: 'byMorose',
toString: [Function] {
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular] }
}
}

util.isArray(object)

如果給定的參數object是一個數組返回true,否則返回false

1
2
3
4
5
6
7
8
9
10
var util = require('util');

// util.isArray([])
console.log(util.isArray([]));

// util.isArray(new Array)
console.log(util.isArray(new Array));

// util.isArray({})
console.log(util.isArray({}));

執行結果如下:

1
2
3
4
$ node main.js
true
true
false

util.isRegExp(object)

如果給定的參數object是一個正則表達式返回true,否則返回false

1
2
3
4
5
6
7
8
9
10
var util = require('util');

// util.isRegExp(/some regexp/)
console.log(util.isRegExp(/some regexp/));

// util.isRegExp(new RegExp('another regexp'))
console.log(util.isRegExp(new RegExp('another regexp')));

// util.isRegExp({})
console.log(util.isRegExp({}));

執行結果如下:

1
2
3
4
$ node main.js
true
true
false

util.isDate(object)

如果給定的參數object"是一個日期返回true,否則返回false

1
2
3
4
5
6
7
8
9
10
var util = require('util');

// util.isDate(new Date())
console.log(util.isDate(new Date()));

// util.isDate(Date()) (without 'new' returns a String)
console.log(util.isDate(Date()));

// util.isDate({})
console.log(util.isDate({}));

執行結果如下:

1
2
3
4
$ node main.js
true
false
false

總結

還有很多很好用的API這邊並沒有辦法全部列出來,建議可以直接看Node.js Util Documentation,這邊列出截至2020-01-21Util.API清單。

  • Util
    • util.callbackify(original)
    • util.debuglog(section)
    • util.deprecate(fn, msg[, code])
    • util.format(format[, …args])
    • util.formatWithOptions(inspectOptions, format[, …args])
    • util.getSystemErrorName(err)
    • util.inherits(constructor, superConstructor)
    • util.inspect(object[, options])
    • util.inspect(object[, showHidden[, depth[, colors]]])
    • Customizing util.inspect colors
      • Modifiers
      • Foreground colors
      • Background colors
    • Custom inspection functions on Objects
    • util.inspect.custom
    • util.inspect.defaultOptions
    • util.isDeepStrictEqual(val1, val2)
    • util.promisify(original)
    • Custom promisified functions
    • util.promisify.custom
    • Class: util.TextDecoder
    • WHATWG Supported Encodings
      • Encodings Supported by Default (With Full ICU Data)
      • Encodings Supported when Node.js is built with the small-icu option
      • Encodings Supported when ICU is disabled
    • new TextDecoder([encoding[, options]])
    • textDecoder.decode([input[, options]])
    • textDecoder.encoding
    • textDecoder.fatal
    • textDecoder.ignoreBOM
    • Class: util.TextEncoder
    • textEncoder.encode([input])
    • textEncoder.encodeInto(src, dest)
    • textEncoder.encoding
    • util.types
    • util.types.isAnyArrayBuffer(value)
    • util.types.isArgumentsObject(value)
    • util.types.isArrayBuffer(value)
    • util.types.isAsyncFunction(value)
    • util.types.isBigInt64Array(value)
    • util.types.isBigUint64Array(value)
    • util.types.isBooleanObject(value)
    • util.types.isBoxedPrimitive(value)
    • util.types.isDataView(value)
    • util.types.isDate(value)
    • util.types.isExternal(value)
    • util.types.isFloat32Array(value)
    • util.types.isFloat64Array(value)
    • util.types.isGeneratorFunction(value)
    • util.types.isGeneratorObject(value)
    • util.types.isInt8Array(value)
    • util.types.isInt16Array(value)
    • util.types.isInt32Array(value)
    • util.types.isMap(value)
    • util.types.isMapIterator(value)
    • util.types.isModuleNamespaceObject(value)
    • util.types.isNativeError(value)
    • util.types.isNumberObject(value)
    • util.types.isPromise(value)
    • util.types.isProxy(value)
    • util.types.isRegExp(value)
    • util.types.isSet(value)
    • util.types.isSetIterator(value)
    • util.types.isSharedArrayBuffer(value)
    • util.types.isStringObject(value)
    • util.types.isSymbolObject(value)
    • util.types.isTypedArray(value)
    • util.types.isUint8Array(value)
    • util.types.isUint8ClampedArray(value)
    • util.types.isUint16Array(value)
    • util.types.isUint32Array(value)
    • util.types.isWeakMap(value)
    • util.types.isWeakSet(value)
    • util.types.isWebAssemblyCompiledModule(value)

註:以上參考了
Node.js 常用工具