util模块是一类包罗万象的模块。它提供了实用函数来格式化字符串,将对象转换为字符串,检查对象的类型,并执行对输出流的同步写入,以及一些对象继承的增强。
这篇文章涵盖了util模块中的大部分功能,还介绍了如何在Node.js应用程序中使用util模块
1,格式化字符串
在处理字符串数据时,你通常需要快速格式化字符串。Node.js在util模块中提供了一个基本的字符串格式化方法来处理许多字符串格式化的需要。util.format()函数接受一个格式化字符串作为第一个参数,并返回一个格式化后的字符串。以下是format()方式的语法,其中format是格式化字符串而[...]表示后面的参数:
util.format(format,[...])
format参数是可用包含零个或多个占位符的字符串。每一个占位符都一一个%字符开始,并最终被相应的参数转换的字符串值取代。第一个格式化占位符表示第二个参数等。以下是受支持的占位符。
- %s : 指定字符串
- %d : 指定一个数值
- %j : 指定一个JSON可转换为字符串的对象
- % : 如果%后保留为空,则不作为占位符。
使用format()时请注意以下几点。
- 当参数没有占位符那么多是,多余的占位符,如%s,都不会被替换。
- 当有比占位符更多的参数时,多余的参数被转换为字符串,然后用空格分隔符连接起来。例如 util.format('%s=%s','item1','item2','item3'); //'item1 = item2 item3'
- 如果第一个参数不是一个格式化字符串,那么util.format()把每个参数都转换为字符串,用空格分隔符将其连接在一起,然后返回连接后的字符串。例如: util.format(1,2,3); // '1,2,3'
2,检查对象类型
确定你去命令取回的一个对象是否是特定的类型通常很有用。你可用用几种不同的方式做到这一点。例如,一种方法是使用isinstanceof运算符,它比较对象的类型并且返回true或false。例如:
([1,2,3] instance of Array) //true
util模块还提供了isArray(object),isRegExp(object),isDate(object)和isError(object)等方便的方法来确定一个对象是否是一个Array(数组),RexExp(正则表达式),Date(日期)或Error(错误)对象。例如:
(util.isArray[1,2,3]) //true
3,同步写入输出流
util模块的有用功能之一是同步写数据到stdout和stderr的能力,这意味着这一进程保持阻塞,直到数据被写出来。这使你可用确保当数据被写入时,系统并没有改变它的行为。
你可以使用下面这些调用中的一个来同步地写入数据,每个调用都会阻塞进程,直到写操作完成为止。
- util.debug(string):把string写入stderr中
- util.error([...]):接受多个参数,将其写入stderr。例如: util.error(errorCode,"errorname");
- util.puts([...]):接受多个参数,并把他们写入stdout
- util.print([...]):接受多个参数,把每个参数都转换为字符串,然后将它们写入stdout。
- util.log(string):把string以及一个时间戳写入stdout。例如: util.log('Some message.');
4,将JavaScript对象转换为字符串
通常,尤其是调试的时候,你需要把一个JavaScript对象转换为字符串表示。util.inspect()方法允许你检查一个对象,然后返回该对象的字符串表示形式。
下面是inspect()方法的语法:
util.inspect(object,[options])
object参数是要转换为字符串的JavaScript对象。options方法可以让你控制格式化过程的某些方面。
var obj = {first:'Brad',last:'Dayley' };
obj.inspect = function(depth){
return '{name:"'+this.first+" "+this.last + '"}'
};
console.log(util.inspect(obj));
//{name:"Brad Dayley"}
5,从其他对象继承功能
util模块提供了util.inherits()方法来允许你创建一个继承另一个对象的prototype(原型)方法的对象。当你创建一个新的对象时,prototype方法自动被使用。例如,实现自己的自定义Readable和Writable流的时候。
以下是util.inherits()方法的语法:
util.interits(constructor,superConstructor)
原型constructor被设定为原型superConstructor,并在一个新的对象被创建时执行。你可以通过使用constructor.super_属性从你的自定义对象的构造函数访问superConstructor。
下面清单中的代码说明了使用inherits()继承events.EventEmitter对象构造函数来创建一个Writable流。
var util = require("util");
var events = require("events");
function Writer(){
events.EventEmitter.call(this);
}
util.inherits(Writer,events.EventEmitter);
Writer.prototype.write = function(data){
this.emit("data",data);
};
var w = new Writer();
console.log(w instanceof events.EventEmitter);
console.log(Writer.super_ === events.EventEmitter);
w.on("data",function(data){
console.log('Received data:"' + data + '"');
});
w.write("Some Data!");
6,使用dns模块
如果你希望一个Node.js应用程序能够解析DNS域名,查找域,或做反向查找,那么你回发现dns模块非常有用。DNS查找会联系域名服务器并且请求有关特定服务器的记录。反向查找则联系域名服务器并请求与一个IP地址相关联的DNS名称。dns模块提供了最可能需要进行的查找功能。下表列出了这些方法及其语法,以及它们的作用。
方法 | 说明 |
lookup(domain,[family],callback) | 解析域名。famile属性可以是4,6,或者为null,其中4解析第一个找到的A(IPV4)记录,6解析第一个找到的AA AA(IPV6)记录,null则是这两者都解析。默认为null。callback函数接收一个error作为第一个参数,并接收一 个IP地址的数组作为第二个参数。例如: function(error,addresses) |
resolve(domain,[rrtype],callback) | 把域名解析成类型由rrtype指定的记录数组。rrtype利用如下所示。
|
resolve4(domain,callback) | 同resolve,只解析IPV4 |
resolve6(domain,callback) | |
resolveMx(domain,callback) | |
resolveTxt(domain,callback) | |
resolveSrv(domain,callback) | |
resolveCname(domain,callback) | |
resolveNs(domain,callback) | |
reverse(ip,callback) | 对ip地址进行反向查找。如果发生错误,则callback函数接收一个error对象;如果查找成功,则接收域的数组,例如: function(error,domains) |
下面的清单显示了如何执行查找和反向查找。
var dns = require('dns');
console.log("Resolving www.baidu.com ...");
dns.resolve4('www.baidu.com',function(err,addresses){
console.log('IPV4 addresses: ' + JSON.stringify(addresses,false,' '));
addresses.forEach(function(addr){
dns.reverse(addr,function(err,domains){
console.log('Reverse for '+addr + ':' + JSON.stringify(domains));
});
});
});