Node.js 常用工具
util 模块里真正会用到的那几个:promisify、inspect、format、types。
Key Points`util` 是 Node 的杂物间,`promisify` 和 `inspect` 是里面最值钱的两件。
promisify
JavaScript
const util = require('node:util');
const fs = require('node:fs');
const readFile = util.promisify(fs.readFile);
const data = await readFile('package.json', 'utf8');
console.log(JSON.parse(data).name);Output
demoWorks only for error-first callbacks. When the callback yields multiple values (like fs.read), promisify keeps only the first.
inspect
JavaScript
const util = require('node:util');
const obj = { a: 1, b: { c: [1, 2, 3] }, d: new Map([['k', 'v']]) };
console.log(util.inspect(obj));
console.log(util.inspect(obj, { depth: 0, colors: false, compact: true }));
// 深度对比
console.log(util.isDeepStrictEqual({ a: [1] }, { a: [1] }));Output
{ a: 1, b: { c: [ 1, 2, 3 ] }, d: Map(1) { 'k' => 'v' } }
{ a: 1, b: [Object], d: Map(1) {} }
trueconsole.log formats objects with util.inspect internally. For deeper nesting or colour control, call inspect with options.
format 与 占位符
JavaScript
const util = require('node:util');
console.log(util.format('%s 有 %d 个文件,占 %o', 'dir', 3, { ok: true }));
console.log(util.format('%j', { a: 1 }));Output
dir 有 3 个文件,占 { ok: true }
{"a":1}| Placeholder | Meaning |
|---|---|
%s | 字符串 |
%d | 数字 |
%i | 整数 |
%f | 浮点 |
%j | JSON |
%o / %O | 对象(%O 不截断) |
%c | CSS,浏览器端才有用 |
types 与 其他
JavaScript
const { types } = require('node:util');
console.log(types.isPromise(Promise.resolve()));
console.log(types.isDate(new Date()));
console.log(types.isRegExp(/a/));
const { TextDecoder } = require('node:util');
console.log(new TextDecoder('utf-8').decode(Buffer.from('你好')));Output
true
true
true
你好Do not test promises with
x instanceof Promise — it fails across realms (vm, workers). util.types.isPromise is reliable.promisify
JavaScript
const util = require('node:util');
const fs = require('node:fs');
const readFile = util.promisify(fs.readFile);
const data = await readFile('package.json', 'utf8');
console.log(JSON.parse(data).name);Output
demo只对符合 error-first 约定的函数有效。回调有多个返回值时(如 fs.read),promisify 只保留第一个。
inspect
JavaScript
const util = require('node:util');
const obj = { a: 1, b: { c: [1, 2, 3] }, d: new Map([['k', 'v']]) };
console.log(util.inspect(obj));
console.log(util.inspect(obj, { depth: 0, colors: false, compact: true }));
// 深度对比
console.log(util.isDeepStrictEqual({ a: [1] }, { a: [1] }));Output
{ a: 1, b: { c: [ 1, 2, 3 ] }, d: Map(1) { 'k' => 'v' } }
{ a: 1, b: [Object], d: Map(1) {} }
trueconsole.log 内部就是用 util.inspect 格式化对象的。想看深层嵌套或控制颜色,直接用 inspect 传选项。
format 与 占位符
JavaScript
const util = require('node:util');
console.log(util.format('%s 有 %d 个文件,占 %o', 'dir', 3, { ok: true }));
console.log(util.format('%j', { a: 1 }));Output
dir 有 3 个文件,占 { ok: true }
{"a":1}| 占位符 | 含义 |
|---|---|
%s | 字符串 |
%d | 数字 |
%i | 整数 |
%f | 浮点 |
%j | JSON |
%o / %O | 对象(%O 不截断) |
%c | CSS,浏览器端才有用 |
types 与 其他
JavaScript
const { types } = require('node:util');
console.log(types.isPromise(Promise.resolve()));
console.log(types.isDate(new Date()));
console.log(types.isRegExp(/a/));
const { TextDecoder } = require('node:util');
console.log(new TextDecoder('utf-8').decode(Buffer.from('你好')));Output
true
true
true
你好判断 Promise 别用
x instanceof Promise —— 跨 realm(比如 vm 模块、worker)时 instanceof 会失效。用 util.types.isPromise 才可靠。