工具集
下面这些函数位于 util
模块,需要使用 require()
方法加载和访问。
util
模块设计之初的目的是为 Node.js 的内部 API 服务。该模块中的大部分辅助函数对开发者开发程序也很有帮助。如果你发现这些函数并不能满足你的需求,那么建议你开发自己的辅助工具集。我们无意创建一个功能齐全的 util
模块,只会在该模块中编写对 Node.js 内部 API 开发有用的函数。
util.debuglog(setion)
section
,字符串,待调试的程序代码- 返回值类型:Function,记录函数
该方法常用于创建一个限制性函数,该函数根据是否有 NODE_DEBUG
环境变量向 stderr 输出数据。如果 section
的名称出现在环境变量中,那么就会返回一个类似 console.error()
的函数,否则返回一个空操作。
var debuglog = util.debuglog('foo');
var bar = 123;
debuglog('hello from foo [%d]', bar);
如果程序在 NODE_DEBUG=foo
的环境中运行,那么它就会输出类似下面这样的信息:
FOO 3245: hello from foo [123]
这里的 3245
是进程 ID。如果程序运行的环境中没有这样的变量,则不会输出任何信息。此外,你可以使用逗号分隔多个 NODE_DEBUG
环境变量,比如 NODE_DEBU=fs,net,tls
。
util.deprecate(function, string)
该方法用来标明某个函数不能再被使用:
const util = require('util');
exports.puts = util.deprecate(() => {
for (var i = 0, len = arguments.length; i < len; ++i) {
process.stdout.write(arguments[i] + '\n');
}
}, 'util.puts: Use console.log instead');
最终返回一个修改后的函数,调用该函数时默认会发出一次警示。
如果开启了 --no-deprecation
选项,则该函数为空操作。通过布尔类型的 process.noDeprecation
,可以在程序运行中配置该参数,需要注意的是,必须在模块加载前执行该配置。
如果开启了 --trace-deprecation
选项,则该函数第一次被调用时,会在控制台输出提示和堆栈跟踪信息。通过布尔类型的 process.traceDeprecation
,可以在程序运行中配置该参数。
如果开启了 --throw-deprecation
选项,则该函数被调用时抛出错误。通过布尔类型的 process.throwDeprecation
,可以在程序运行中配置该参数。process.throwDeprecation
优先级高于 process.traceDeprecation
。
util.format(format[, ...])
该方法类似 printf
函数,返回一个格式化后的字符串。
第一个参数是一个字符串,包含一个或多个占位符。支持的占位符包括以下几种:
%s
,字符串%d
,数值,整数或浮点数%j
,JSON,如果参数中包含循环引用,则使用[Circular]
表示%%
,百分号
如果占位符缺少对应的参数,则直接输出该占位符:
util.format('%s:%s', 'foo');
// 'foo:%s'
如果参数多余占位符,则该参数被转换为字符串(如果参数是对象或者 symbol,则使用 util.inspect()
进行转换),然后使用空格连接成一个字符串:
util.format('%s:%s', 'foo', 'bar', 'baz');
// 'foo:bar baz'
如果第一个参数不包含占位符,则 util.format()
返回一个字符串,该字符串由所有参数连接而成,参数之间以空格分隔。参数转换时,使用 util.inspect()
方法进行转换:
util.format(1, 2, 3);
// '1 2 3'
util.inherits(constructor, superConstructor)
该方法使 constructor
构造函数继承 superConstructor
构造函数的原型方法。这里的 superConstructor
也可以通过 constructor.super_
属性得到。
const util = require('util');
const EventEmitter = require('events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
}
var stream = new MyStream();
console.log(stream instanceof EventEmitter);
// true
console.log(MyStream.super_ === EventEmitter);
// true
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
})
stream.write('It works!');
// Received data: "It works!"
util.inspect(object[, options])
该方法返回 object
参数的字符串形式,常用于代码调试。
可选的参数对象 options
可以用来改变字符串格式化后的样式:
showHidden
,如果为 true,则显示对象的不可枚举和 symbol 属性,默认值为 falsedepth
,指定inspect()
方法格式化object
时的深度。这对于格式化复杂对象很有用。默认值为 2,如果不限制深度,可以设置为 `nullcolors
,如果值为 true,则使用 ANSI 颜色码对输出信息加以美化。默认值为 falsecustomInspect
,如果值为 false,则object
对象上自定义的inspect(depth, opts)
函数不会被执行,默认值为 true。
下面代码演示了如何审查 util
对象的所有属性:
const util = require('util');
console.log(util.inspect(util, { showHidden: true, depth: null }));
该方法被调用时,object
对象可以使用自定义的 inspect(depth, opts)
方法,该方法接收两个参数,一个是当前的递归深度,另一个是传递给 util.inspect()
的可选对象。
自定义 util.inspect 颜色
util.inspect()
的输出颜色可由 util.inspect.styles
和 util.inspect.colors
进行配置。
util.inspect.styles
与 util.inpect.colors
中的颜色一一对应。常见数据类型的默认高亮样式:
- Number,黄色
- Boolean,黄色
- String,绿色
- Date,洋红
- Regexp,红色
- Null,黑体,
- Undefined,灰色,
- Special,青色,目前 special 只包括 Function 类型
- Name,默认无样式
系统预定义的颜色包括:white
/ grey
/ black
/ blue
/ cyan
/ green
/ magenta
/ red
和 yellow
。此外,还有 bold
/ italic
/ underline
和 inverse
样式。
自定义对象的 inspect() 函数
对象也可以自定义 inspect(depth)
函数,当 util.inspect()
方法审查该对象时就会调用这一自定义的方法:
const util = require('util');
var obj = { name: 'nate' };
obj.inspect = function(depth) {
return `{${this.name}}`;
};
util.inspect(obj);
// "{nate}"
也可以从自定义的方法返回另一个对象,util.inspect()
方法会返回根据该对象返回格式化的字符串,非常类似 JSON.stringify()
的工作方式:
var obj = { foo: 'this will not show up in the inspect() output' };
obj.inspect = function(depth) {
return { bar: 'baz' };
};
util.inspect(obj);
// "{ bar: 'baz' }"
util.log(string)
在 stdout
输出的同时带上时间戳。
require('util').log('Timestamped message.');
以下函数已被抛弃
- util.debug(string)
- util.error([...])
- util.isArray(object)
- util.isBoolean(object)
- util.isBuffer(object)
- util.isDate(object)
- util.isError(object)
- util.isFunction(object)
- util.isNull(object)
- util.isNullOrUndefined(object)
- util.isNumber(object)
- util.isObject(object)
- util.isPrimitive(object)
- util.isRegExp(object)
- util.isString(object)
- util.isSymbol(object)
- util.isUndefined(object)
- util.print([...])
- util.pump(readableStream, writableStream[, callback])
- util.puts([...])