穩(wěn)定性: 4 - 鎖定
本節(jié)介紹Node.js的'util'
模塊中的函數(shù)的使用,通過(guò)require('util')
訪(fǎng)問(wèn)該模塊,如下所示:
const util = require('util');
util
模塊原先設(shè)計(jì)的初衷是用來(lái)支持Node.js的內(nèi)部API的。這里的很多的函數(shù)對(duì)你的程序來(lái)說(shuō)都非常有用。如果你覺(jué)得這些函數(shù)不能滿(mǎn)足你的要求,那你可以寫(xiě)自己的工具函數(shù)。我們不希望'util'
模塊里添加對(duì)于node內(nèi)部函數(shù)無(wú)用的擴(kuò)展。
section
{字符串} 被調(diào)試的程序節(jié)點(diǎn)部分用來(lái)創(chuàng)建一個(gè)有條件的寫(xiě)到stderr的函數(shù)(基于NODE_DEBUG
環(huán)境變量)。如果section
出現(xiàn)在環(huán)境變量里,返回函數(shù)將會(huì)和console.error()
類(lèi)似。否則,返回一個(gè)空函數(shù)。
例如:
javascript
var debuglog = util.debuglog('foo');
var bar = 123;
debuglog('hello from foo [%d]', bar);
如果這個(gè)程序以NODE_DEBUG=foo
的環(huán)境運(yùn)行,將會(huì)輸出:
FOO 3245: hello from foo [123]
3245
是進(jìn)程ID。如果沒(méi)有運(yùn)行在這個(gè)環(huán)境變量里,將不會(huì)打印任何東西。
可以用逗號(hào)切割多個(gè)NODE_DEBUG
環(huán)境變量。例如:NODE_DEBUG=fs,net,tls
。
使用第一個(gè)參數(shù)返回一個(gè)格式化的字符串,類(lèi)似printf
。
第一個(gè)參數(shù)是字符串,它包含0或更多的占位符。每個(gè)占位符被替換成想要參數(shù)轉(zhuǎn)換的值。支持的占位符包括:
%s
- 字符串.%d
- 數(shù)字 (整數(shù)和浮點(diǎn)數(shù)).%j
- JSON。如果參數(shù)包含循環(huán)引用,將會(huì)用字符串替換R%%
- 單獨(dú)一個(gè)百分號(hào) ('%'
)。 不會(huì)消耗一個(gè)參數(shù)。如果占位符沒(méi)有包含一個(gè)相應(yīng)的參數(shù),占位符不會(huì)被替換。
util.format('%s:%s', 'foo'); // 'foo:%s'
如果參數(shù)超過(guò)占位符,多余的參數(shù)將會(huì)用util.inspect()
轉(zhuǎn)換成字符串,并拼接在一起,用空格隔開(kāi)。
util.format('%s:%s', 'foo', 'bar', 'baz'); // 'foo:bar baz'
如果第一個(gè)參數(shù)不是格式化字符串,那么util.format()
會(huì)返回所有參數(shù)拼接成的字符串(空格分割)。每個(gè)參數(shù)都會(huì)用util.inspect()
轉(zhuǎn)換成字符串。
util.format(1, 2, 3); // '1 2 3'
在stdout
輸出并帶有時(shí)間戳:
require('util').log('Timestamped message.');
返回一個(gè)對(duì)象的字符串表現(xiàn)形式,在代碼調(diào)試的時(shí)候非常有用。
通過(guò)加入一些可選選項(xiàng),來(lái)改變對(duì)象的格式化輸出形式:
showHidden
- 如果為true
,將會(huì)顯示對(duì)象的不可枚舉屬性。默認(rèn)為false
。
depth
- 告訴inspect
格式化對(duì)象時(shí)遞歸多少次。這在格式化大且復(fù)雜對(duì)象時(shí)非常有用。默認(rèn)為 2
。如果想無(wú)窮遞歸的話(huà),傳null
。
colors
- 如果為true
,輸出內(nèi)容將會(huì)格式化為有顏色的代碼。默認(rèn)為false
, 顏色可以自定義,參見(jiàn)下文。
customInspect
- 如果為false
,那么定義在被檢查對(duì)象上的inspect(depth, opts) 方法將不會(huì)被調(diào)用。 默認(rèn)為true。檢查util
對(duì)象上所有屬性的例子:
var util = require('util');
console.log(util.inspect(util, { showHidden: true, depth: null }));
當(dāng)被調(diào)用的時(shí)候,參數(shù)值可以提供自己的自定義inspect(depth, opts)方法。該方法會(huì)接收當(dāng)前的遞歸檢查深度,以及傳入util.inspect()的其他參數(shù)。
util.inspect
顏色util.inspect
通過(guò)util.inspect.styles
和util.inspect.colors
對(duì)象,自定義全局的輸出顏色,
util.inspect.styles
和util.inspect.colors
組成風(fēng)格顏色的一對(duì)映射。
高亮風(fēng)格和他們的默認(rèn)值:
數(shù)字
(黃色)boolean
(黃色)字符串
(綠色)date
(洋紅)regexp
(紅色)null
(粗體)undefined
(斜體)special
(青綠色)name
(內(nèi)部用,不是風(fēng)格)預(yù)定義的顏色為: white
、斜體
、black
、blue
、cyan
、綠色
、洋紅
、紅色
和黃色
以及粗體
、斜體
、下劃線(xiàn)
和反選
風(fēng)格。
inspect()
函數(shù)對(duì)象也能自定義inspect(depth)
函數(shù), 當(dāng)使用util.inspect()檢查該對(duì)象的時(shí)候,將會(huì)執(zhí)行對(duì)象自定義的檢查方法:
var util = require('util');
var obj = { name: 'nate' };
obj.inspect = function(depth) {
return '{' + this.name + '}';
};
util.inspect(obj);
// "{nate}"
你可以返回另外一個(gè)對(duì)象,返回的字符串會(huì)根據(jù)返回的對(duì)象格式化。這和JSON.stringify()
的工作流程類(lèi)似。您還可以完全返回另一個(gè)對(duì)象,返回的字符串將根據(jù)返回的對(duì)象格式化。這與JSON.stringify()
的工作方式類(lèi)似:
var obj = { foo: 'this will not show up in the inspect() output' };
obj.inspect = function(depth) {
return { bar: 'baz' };
};
util.inspect(obj);
// "{ bar: 'baz' }"
Array.isArray的內(nèi)部別名。
如果參數(shù)"object"是數(shù)組,返回true
,否則返回false
。
var util = require('util');
util.isArray([])
// true
util.isArray(new Array)
// true
util.isArray({})
// false
如果參數(shù)"object"是RegExp
返回true
,否則返回false
。
var util = require('util');
util.isRegExp(/some regexp/)
// true
util.isRegExp(new RegExp('another regexp'))
// true
util.isRegExp({})
// false
如果參數(shù)"object"是Date
返回true
,否則返回false
。
var util = require('util');
util.isDate(new Date())
// true
util.isDate(Date())
// false (without 'new' returns a String)
util.isDate({})
// false
如果參數(shù)"object"是Error
返回true
,否則返回false
。
var util = require('util');
util.isError(new Error())
// true
util.isError(new TypeError())
// true
util.isError({ name: 'Error', message: 'an error occurred' })
// false
從一個(gè)構(gòu)造函數(shù)constructor繼承原型方法到另一個(gè)。構(gòu)造函數(shù)的原型將被設(shè)置為一個(gè)新的從超類(lèi)(superConstructor
)創(chuàng)建的對(duì)象。
通過(guò)constructor.super_
屬性可以訪(fǎng)問(wèn)superConstructor
。
var util = require("util");
var events = require("events");
function MyStream() {
events.EventEmitter.call(this);
}
util.inherits(MyStream, events.EventEmitter);
MyStream.prototype.write = function(data) {
this.emit("data", data);
}
var stream = new MyStream();
console.log(stream instanceof events.EventEmitter); // true
console.log(MyStream.super_ === events.EventEmitter); // true
stream.on("data", function(data) {
console.log('Received data: "' + data + '"');
})
stream.write("It works!"); // Received data: "It works!"
標(biāo)明該方法不要再使用。
exports.puts = exports.deprecate(function() {
for (var i = 0, len = arguments.length; i < len; ++i) {
process.stdout.write(arguments[i] + '\n');
}
}, 'util.puts: Use console.log instead')
返回一個(gè)修改過(guò)的函數(shù),默認(rèn)情況下僅警告一次。如果設(shè)置了--no-deprecation
該函數(shù)不做任何事。如果設(shè)置了--throw-deprecation
,如果使用了該API應(yīng)用將會(huì)拋出異常。
穩(wěn)定性: 0 - 拋棄: 使用 console.error() 替換。
console.error
的前身。
穩(wěn)定性: 0 - 拋棄: 使用 console.error() 替換。
console.error
的前身。
穩(wěn)定性: 0 - 拋棄:使用 console.log() 替換。
console.log
的前身。
穩(wěn)定性: 0 - 拋棄: 使用 console.log() 替換。
console.log
的前身。
穩(wěn)定性: 0 - 拋棄: Use readableStream.pipe(writableStream)
stream.pipe
的前身。
更多建議: