一、util 模块概述
Node.js 中的util模块是一个核心模块,提供了一系列实用工具函数。这些函数主要用于帮助开发者完成常见的编程任务,如类型检查、继承实现、调试输出等。util模块的设计初衷是弥补 JavaScript 原生功能的不足,为开发者提供更多便利。
要使用util模块,只需在代码中引入它:
const util = require('util');二、主要功能分类
| 功能分类 | 说明 | 主要方法 |
|---|---|---|
| 类型检查 | 精确判断数据类型 | util.types.* |
| 字符串格式化 | 格式化输出 | util.format(),util.inspect() |
| 回调风格转换 | 回调 ↔ Promise 互转 | util.promisify(),util.callbackify() |
| 继承工具 | 原型继承 | util.inherits() |
| 调试工具 | 调试输出 | util.debuglog(),util.inspect() |
| 废弃标记 | 标记过时函数 | util.deprecate() |
三、类型检查工具
util.types提供了一系列精确的类型检查方法,比typeof和instanceof更加可靠。
const util = require('util'); // ArrayBuffer 检查 const arrBuffer = new ArrayBuffer(8); console.log(util.types.isArrayBuffer(arrBuffer)); // true console.log(util.types.isArrayBuffer([])); // false // Date 检查 console.log(util.types.isDate(new Date())); // true console.log(util.types.isDate('2023-01-01')); // false常用类型检查方法
| 方法 | 描述 |
|---|---|
util.types.isArrayBuffer(value) | 检查是否为 ArrayBuffer |
util.types.isAsyncFunction(value) | 检查是否为异步函数 |
util.types.isDate(value) | 检查是否为 Date |
util.types.isMap(value) | 检查是否为 Map |
util.types.isSet(value) | 检查是否为 Set |
util.types.isRegExp(value) | 检查是否为正则表达式 |
util.types.isPromise(value) | 检查是否为 Promise |
util.types.isTypedArray(value) | 检查是否为 TypedArray |
四、实用工具函数
util.format() - 字符串格式化
类似于 C 语言中的printf函数,用于格式化字符串。
const util = require('util'); const name = 'John'; const age = 30; console.log(util.format('My name is %s and I am %d years old', name, age)); // 输出: My name is John and I am 30 years old // 支持多种占位符 console.log(util.format('%s - %d - %j', 'string', 123, { key: 'value' })); // 输出: string - 123 - {"key":"value"}util.inspect() - 对象检查
返回对象的字符串表示,主要用于调试。可以配置深度、颜色等选项。
const util = require('util'); const obj = { name: 'Alice', details: { age: 25, hobbies: ['reading', 'coding'] } }; console.log(util.inspect(obj, { depth: 2, colors: true }));util.inspect 常用选项
| 选项 | 说明 |
|---|---|
depth | 递归深度(null表示无限) |
colors | 是否使用颜色输出 |
showHidden | 是否显示不可枚举属性 |
compact | 是否压缩输出 |
五、回调风格转换
util.promisify() - 回调转 Promise
将遵循 Node.js 回调风格的函数转换为返回 Promise 的函数。
const util = require('util'); const fs = require('fs'); // 将回调风格的 fs.readFile 转换为返回 Promise 的函数 const readFile = util.promisify(fs.readFile); async function readConfig() { try { const data = await readFile('config.json', 'utf8'); console.log(data); } catch (err) { console.error('Error reading file:', err); } } readConfig();util.callbackify() - Promise 转回调
与promisify相反,将返回 Promise 的函数转换为回调风格的函数。
const util = require('util'); async function asyncFunc() { return 'Hello World'; } const callbackFunc = util.callbackify(asyncFunc); callbackFunc((err, result) => { if (err) throw err; console.log(result); // Hello World });六、继承工具
util.inherits() - 原型继承
实现原型继承(ES5 风格)。
注意:在 ES6 中,建议使用
class和extends关键字代替。
const util = require('util'); function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + ' makes a noise.'); }; function Dog(name) { Animal.call(this, name); } util.inherits(Dog, Animal); Dog.prototype.speak = function() { console.log(this.name + ' barks.'); }; const d = new Dog('Rex'); d.speak(); // Rex barks.七、废弃标记
util.deprecate() - 标记废弃函数
包装函数,使其被调用时发出弃用警告。
const util = require('util'); const oldFunction = util.deprecate( () => { console.log('This function is deprecated'); }, 'oldFunction is deprecated. Use newFunction instead.' ); oldFunction(); // 输出: This function is deprecated // (Node.js 会显示弃用警告)八、实际应用场景
1. 调试复杂对象
当需要打印复杂对象的结构时,util.inspect比简单的console.log更强大:
const util = require('util'); const complexObj = { date: new Date(), regex: /test/g, nested: { array: [1, 2, 3], fn: function() {} } }; console.log(util.inspect(complexObj, { showHidden: true, depth: null, colors: true }));2. 现代化旧代码
将回调风格的旧代码转换为 Promise 风格:
const util = require('util'); // 旧的回调风格代码 function oldStyleFunc(param, callback) { setTimeout(() => { callback(null, `Result for ${param}`); }, 100); } // 转换为 Promise 风格 const newStyleFunc = util.promisify(oldStyleFunc); async function useNewStyle() { const result = await newStyleFunc('test'); console.log(result); // Result for test } useNewStyle();3. 自定义对象检查
可以自定义对象的inspect方法,改变util.inspect的输出:
const util = require('util'); class CustomObject { constructor(value) { this.value = value; } [util.inspect.custom](depth, options) { return `CustomObject: ${this.value}`; } } const obj = new CustomObject('test'); console.log(util.inspect(obj)); // CustomObject: test九、方法完整列表
| 方法 | 描述 | 版本 |
|---|---|---|
util.callbackify(original) | Promise 转回调风格函数 | 8.2.0 |
util.debuglog(section) | 条件调试日志 | 0.11.3 |
util.deprecate(fn, msg[, code]) | 标记废弃函数 | 0.8.0 |
util.format(format[, ...args]) | 格式化字符串 | 0.5.3 |
util.formatWithOptions(inspectOptions, format[, ...args]) | 带选项的格式化 | 10.0.0 |
util.getSystemErrorName(err) | 获取系统错误名称 | 9.7.0 |
util.inherits(constructor, superConstructor) | 原型继承 | 0.3.0 |
util.inspect(object[, options]) | 对象字符串表示 | 0.3.0 |
util.isDeepStrictEqual(val1, val2) | 深度严格相等比较 | 9.0.0 |
util.promisify(original) | 回调转 Promise | 8.0.0 |
util.stripVTControlCharacters(str) | 剥离 ANSI 转义码 | 16.11.0 |
util.parseArgs([config]) | 命令行参数解析 | 18.3.0 |
util.types | 类型检查工具对象 | 10.0.0 |
十、注意事项
| 注意事项 | 说明 |
|---|---|
| 性能考虑 | util.inspect对于大型对象可能有性能影响,生产环境需谨慎使用 |
| API 稳定性 | 某些 API 可能仍被标记为实验性功能 |
| 现代替代方案 | util.inherits在现代 JavaScript 中可用class/extends替代 |
| 错误处理 | 使用promisify时需正确处理错误,避免未捕获的 Promise 拒绝 |
十一、本章小结
| 知识点 | 说明 |
|---|---|
| util 模块 | Node.js 内置实用工具模块 |
| 类型检查 | util.types.*提供精确的类型判断 |
| 字符串格式化 | util.format()和util.inspect() |
| 回调风格转换 | util.promisify()和util.callbackify() |
| 继承工具 | util.inherits()(ES6 后推荐class/extends) |
| 废弃标记 | util.deprecate()标记过时函数 |
| 调试工具 | util.inspect()可自定义对象输出 |
提示:
util.promisify是日常开发中最常用的方法,它让你能够将大量基于回调的 Node.js 核心模块函数转换为返回 Promise 的函数,从而与async/await完美配合。掌握util模块的使用,可以让你的 Node.js 开发更加得心应手,特别是在调试和代码转换方面。