NodeJs-Utilities

 后端   小卒子   2024-09-11 09:25   196
  nodejs

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 提供了一系列用于类型检查的工具函数,类似于 typeofinstanceof,但更为准确。

常用方法:

  • 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 中推荐使用 classextends

示例:

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.TextEncoderutil.TextDecoder

TextEncoderTextDecoder 是用于处理文本编码和解码的工具,可以将字符串编码为 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 环境中进行快速开发和调试。