Node.js 的 util 模块提供了许多实用的函数和工具,帮助开发者处理调试、继承、类型检查等常见的任务。util 模块特别适合进行日志记录、格式化输出以及处理异步操作等。以下是该模块的所有属性和方法的详细介绍及使用示例,涵盖了模块的各个方面。
1. 引入 util 模块
首先,通过 require 引入 util 模块:
const util = require('util');
2. util.format()
util.format(format, [...args]) 方法用于字符串格式化,它类似于 printf 这样的函数。
%s:字符串%d:数字(包括整数和浮点数)%i:整数%f:浮点数%j:JSON%%:百分号(不会被替换)
示例:
const util = require('util');
const str = util.format('My name is %s, and I am %d years old.', 'Alice', 30);
console.log(str); // 输出: My name is Alice, and I am 30 years old.
3. util.inspect()
util.inspect(object, [options]) 方法用于将任意对象转为字符串,适合用于调试和日志记录。它会对对象进行递归输出,提供对嵌套对象的完整查看。
showHidden:默认false,显示隐藏属性。depth:递归显示对象的层级深度,默认值为2。colors:输出是否带颜色,默认值为false。customInspect:如果true,则对象的inspect()方法会被调用,默认值为true。
示例:
const util = require('util');
const obj = { a: 5, b: { c: 10 } };
console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));
4. util.types
util.types 提供了一系列用于类型检查的工具函数,类似于 typeof 和 instanceof,但更为准确。
常用方法:
util.types.isDate(value):检查对象是否是Date。util.types.isRegExp(value):检查对象是否是正则表达式。util.types.isSet(value):检查对象是否是Set。util.types.isMap(value):检查对象是否是Map。
示例:
const util = require('util');
console.log(util.types.isDate(new Date())); // true
console.log(util.types.isRegExp(/abc/)); // true
console.log(util.types.isMap(new Map())); // true
console.log(util.types.isSet(new Set())); // true
5. util.callbackify()
util.callbackify() 将返回一个把 async 函数转换为遵循错误优先风格的回调函数的函数。返回的函数会将异步函数的结果传递给回调。
示例:
const util = require('util');
async function foo() {
return 'Hello';
}
const callbackFoo = util.callbackify(foo);
callbackFoo((err, result) => {
if (err) throw err;
console.log(result); // 输出: 'Hello'
});
6. util.promisify()
util.promisify() 将传统的回调风格函数(即最后一个参数是回调函数的函数)转换为返回 Promise 的函数。
示例:
const util = require('util');
const fs = require('fs');
const readFile = util.promisify(fs.readFile);
readFile('./example.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
7. util.deprecate()
util.deprecate() 方法用于将某个函数标记为废弃。调用被废弃的函数时,会显示一条警告信息。适用于标记不推荐使用的 API。
示例:
const util = require('util');
const oldFunc = util.deprecate(() => {
console.log('This function is deprecated');
}, 'oldFunc() is deprecated and will be removed in future versions');
oldFunc(); // 调用时会输出警告信息
8. util.inherits()
util.inherits(constructor, superConstructor) 是用于对象原型继承的工具函数,帮助简化构造函数的继承。注意:在 ES6 中推荐使用 class 和 extends。
示例:
const util = require('util');
function Person() {
this.name = 'Alice';
}
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
function Student() {
Person.call(this);
this.age = 20;
}
util.inherits(Student, Person);
const student = new Student();
student.sayHello(); // 输出: Hello, my name is Alice
9. util.TextEncoder 和 util.TextDecoder
TextEncoder 和 TextDecoder 是用于处理文本编码和解码的工具,可以将字符串编码为 Uint8Array,或从字节数组解码为字符串。
示例:
const { TextEncoder, TextDecoder } = require('util');
const encoder = new TextEncoder();
const decoder = new TextDecoder();
const encoded = encoder.encode('Hello, world!');
console.log(encoded); // 输出: Uint8Array
const decoded = decoder.decode(encoded);
console.log(decoded); // 输出: 'Hello, world!'
10. util.log()
util.log() 是一个简单的日志记录函数,输出信息并附带时间戳。
示例:
const util = require('util');
util.log('Server started'); // 输出: '21 Sep 10:56:23 - Server started'
11. util.getSystemErrorName()
util.getSystemErrorName() 接受一个错误码,返回对应的系统错误名称(如 ENOENT, EADDRINUSE 等)。
示例:
const util = require('util');
const errorName = util.getSystemErrorName(-2);
console.log(errorName); // 输出: ENOENT
12. util.debuglog()
util.debuglog() 创建一个用于调试的日志函数,该函数仅在特定环境变量被设置时输出日志信息。
示例:
const util = require('util');
const debuglog = util.debuglog('myapp');
debuglog('Debugging message: %o', { foo: 'bar' });
要启用日志输出,需要设置环境变量 NODE_DEBUG=myapp。
13. util.inspect.custom
util.inspect.custom 是一个用于定制对象的 util.inspect() 输出的符号。通过实现该属性,可以控制对象在被 util.inspect() 时的输出行为。
示例:
const util = require('util');
class MyClass {
constructor() {
this.foo = 'bar';
}
[util.inspect.custom]() {
return 'MyClass instance';
}
}
const myInstance = new MyClass();
console.log(util.inspect(myInstance)); // 输出: MyClass instance
14. util.promisify.custom
util.promisify.custom 是一个符号,用于定义 promisify 方法的自定义行为。通过实现该属性,函数可以自定义如何被 util.promisify() 转换。
示例:
const util = require('util');
function customAsyncFunction(callback) {
callback(null, 'result');
}
customAsyncFunction[util.promisify.custom] = () => {
return Promise.resolve('custom result');
};
const promisified = util.promisify(customAsyncFunction);
promisified().then(result => {
console.log(result); // 输出: 'custom result'
});
总结
Node.js 的 util 模块为开发者提供了一系列实用工具,简化了开发过程中常见任务的处理。它支持字符串格式化、对象的调试输出、类型检查、异步函数的处理等功能,非常适合在 Node.js 环境中进行快速开发和调试。