node.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > node.js > node.js util模块

Node.js中的util 模块详解

作者:烂蜻蜓

Node.js的util模块是一个非常实用的工具库,它提供了许多实用的工具函数,用于提高 Node.js 应用的开发效率,本文给大家介绍Node.js中的util模块,感兴趣的朋友一起看看吧

Node.js 的 util 模块是一个非常实用的工具库,它提供了许多实用的工具函数,用于提高 Node.js 应用的开发效率。在 Node.js 的早期版本中,util 模块包含了诸如 util.inherits 和 util.inspect 等功能,这些功能在后来的版本中被整合到了其他模块中,但 util 模块仍然包含了很多有用的工具。

一、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)回调转 Promise8.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 开发更加得心应手,特别是在调试和代码转换方面。

到此这篇关于Node.js中的util 模块详解的文章就介绍到这了,更多相关node.js util模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文