Node.js 常用工具
参考https://www.runoob.com/nodejs/nodejs-util.html
- util是Node.js的一个核心模块,顾名思义是工具的意思。
使用方法
const util = require('util')
uitl.callbackify
uitl.callbackify(original)将async异步函数(或返回值为Promise的函数)转换为遵循异常优先的回调风格的函数。
original是一个async异步函数或返回值为Promise的函数。
例如将(err, value)=>{}回调作为最后一个参数。
在回调函数中,
- 第一个参数为拒绝的原因(如果Promise解决,则为null),
- 第二个参数是接受的值。
如果是:
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);
// });
console.log(fn());
console.log('程序执行结束');
结果:
Promise { 'hello world!' }
程序执行结束
如果是:
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);
});
// console.log(fn());
console.log('程序执行结束')
结果:
程序执行结束
hello world!
- 回调函数是异步执行的,并且有异常堆栈错误追踪。如果回调函数抛出一个异常,进程则会触发一个'uncaughtException'异常,如果这个进程的异常没有被捕获进程将会退出。
- null在回调函数中作为一个参数具有特殊的意义,如果回调函数的第一个参数为Promise拒绝的原因且带有返回值,且该返回值可以转换为布尔值false,这个值会被封装在Error对象里,并通过属性reason获取。
const util = require('util');
function fn(){
return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret)=>{
// 当Promise以‘null’拒绝时,它被包装为Error且原始值储存在‘reason’中
console.log(err && err.hasOwnProperty('reason') && err.reason===null); // true
});
console.log('程序执行结束');
结果:
程序执行结束
true
util.inherits
util.inherits(constructor, superConstructor)是一个实现对象间原型继承的函数。
- JavaScript的面向对象是基于原型的,与常见的基于类的不同;
- JavaScript只能通过原型复制实现对象继承。
用法:
const 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);
console.log('程序执行结束');
结果:
base
Hellobase
Base { name: 'base', base: 1991, sayHello: [Function (anonymous)] }
sub
Sub { name: 'sub' }
程序执行结束
注意到Sub仅仅继承了Base在原型(prototype)中定义的方法,而sayHello()并未继承。
util.inspect
语法
util.inspect(object, [showHidden], [depth], [colors])是一个将任意对象转换为字符串的方法,通常用于调试和错误输出。
- 至少接受一个参数object,即要转换的对象;
- showHidden默认为false,是否输出更多的隐藏信息;
- depth表示最大递归的层数,默认为2,指定层数可以控制输出信息的多少,null表示不限制层数;
- colors默认为false,如果为true则以ANSI颜色编码,在终端显示更漂亮的效果。
util.inspect()并不是简单地调用toString()方法。
const 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));
console.log('程序执行结束');
结果:
Person { name: 'byvoid', toString: [Function (anonymous)] }
Person {
name: 'byvoid',
toString: <ref *1> [Function (anonymous)] {
[length]: 0,
[name]: '',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *1] }
}
}
程序执行结束
util.isArray(object)
返回值true/false。
const util = require('util');
util.isArray([])
// true
util.isArray(new Array)
// true
util.isArray({})
// false
console.log('程序执行结束');
util.isRegExp(object)
返回值true/false
const util = require('util');
util.isRegExp(/some regexp/)
// true
util.isRegExp(new RegExp('another regexp'))
// true
util.isRegExp({})
// false
console.log('程序执行结束');
util.isDate(object)
返回值true/false
const util = require('util');
util.isDate(new Date())
// true
util.isDate(Date())
// false (without 'new' returns a String)
util.isDate({})
// false
console.log('程序执行结束');