util(实用工具)

util 模块主要用于支持 Node.js 内部 API 的需求。 大部分实用工具也可用于应用程序与模块开发者。 使用方法如下:

const util = require('util');

util.callbackify(original)

original <Function>  async 异步函数。
返回: <Function> 传统回调函数。

将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) => ... 回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如果 Promise 解决,则为 null),第二个参数则是解决的值。 

const util = require('util');

async function fn() {
  return 'hello world';
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  if (err) throw err;
  console.log(ret);
});

 

回调函数是异步执行的,并且有异常堆栈错误追踪。 如果回调函数抛出一个异常,进程会触发一个 'uncaughtException' 异常,如果没有被捕获,进程将会退出。

null 在回调函数中作为一个参数有其特殊的意义,如果回调函数的首个参数为 Promise 拒绝的原因且带有返回值,且值可以转换成布尔值 false,这个值会被封装在 Error 对象里,可以通过属性 reason 获取。

 

function fn() {
  return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);

callbackFunction((err, ret) => {
  // 当 Promise 被以 `null` 拒绝时,它被包装为 Error 并且原始值存储在 `reason` 中。
  err && err.hasOwnProperty('reason') && err.reason === null;  // true
});

 

util.debuglog(section)

section <string> 一个字符串,指定要为应用的哪些部分创建 debuglog 函数。
返回: <Function> 日志函数。
util.debuglog() 方法用于创建一个函数,基于 NODE_DEBUG 环境变量的存在与否有条件地写入调试信息到 stderr。 如果 section 名称在环境变量的值中,则返回的函数类似于 console.error()。 否则,返回的函数是一个空操作。
const util = require('util');
const debuglog = util.debuglog('foo');

debuglog('hello from foo [%d]', 123);

 如果程序在环境中运行时带上 NODE_DEBUG=foo,则输出类似如下:

FOO 3245: hello from foo [123]

其中 3245 是进程 id。 如果运行时没带上环境变量集合,则不会打印任何东西。

section 还支持通配符:

const util = require('util');
const debuglog = util.debuglog('foo-bar');

debuglog('hi there, it\'s foo-bar [%d]', 2333);

如果在环境中使用 NODE_DEBUG=foo* 运行,那么它将输出如下内容: 

FOO-BAR 3257: hi there, it's foo-bar [2333]

 NODE_DEBUG 环境变量中可指定多个由逗号分隔的 section 名称。 例如:NODE_DEBUG=fs,net,tls

 

util.deprecate(fn, msg[, code])

fn <Function> 要被废弃的函数。
msg <string> 当调用废弃的函数时显示的警告消息。
code <string> 废弃码。 有关代码列表,请参阅废弃的 API 列。
返回: <Function> 废弃的函数被包装以发出警告。

util.deprecate() 方法以一种标记为已废弃的方式包装 fn(可以是函数或类)。

const util = require('util');

exports.obsoleteFunction = util.deprecate(() => {
  // 一些操作。
}, 'obsoleteFunction() 已废弃,使用 newShinyFunction() 代替');

当被调用时, util.deprecate() 会返回一个函数,这个函数会使用 'warning' 事件触发一个 DeprecationWarning。 默认情况下,警告只在首次被调用时才会被触发并打印到 stderr。 警告被触发之后,被包装的函数会被调用。

如果在对 util.deprecate() 的多次调用中提供了相同的可选 code,则该 code 仅触发一次警告。

 

const util = require('util');

const fn1 = util.deprecate(someFunction, someMessage, 'DEP0001');
const fn2 = util.deprecate(someOtherFunction, someOtherMessage, 'DEP0001');
fn1(); // 使用代码 DEP0001 触发废弃警告。
fn2(); // 不会触发废弃警告,因为它具有相同的代码。

如果使用了 --no-deprecation 或 --no-warnings 命令行标记,或 process.noDeprecation 属性在首次废弃警告之前被设为 true,则 util.deprecate() 方法什么也不做。

如果设置了 --trace-deprecation 或 --trace-warnings 命令行标记,或 process.traceDeprecation 属性被设为 true,则废弃的函数首次被调用时会把警告与堆栈追踪打印到 stderr

如果设置了 --throw-deprecation 命令行标记,或 process.throwDeprecation 属性被设为 true,则当废弃的函数被调用时会抛出一个异常。

--throw-deprecation 命令行标记和 process.throwDeprecation 属性优先于 --trace-deprecation 和 process.traceDeprecation

 

 

util.format(format[, ...args])

format <string> 一个类似 printf 的格式字符串。
util.format() 方法返回一个格式化后的字符串,使用第一个参数作为一个类似 printf 的格式的字符串,该字符串可以包含零个或多个格式占位符。 每个占位符会被对应参数转换后的值所替换。 支持的占位符有:

%s - String 将用于转换除 BigInt、 Object 和 -0 外的所有值。BigInt 值将用 n 表示,而没有用户定义 toString 函数的对象使用带有选项 { depth: 0, colors: false, compact: 3 } 的 util.inspect() 进行检查。
%d - Number 将用于转换除 BigInt 和 Symbol 之外的所有值。
%i - parseInt(value, 10) 用于除 BigInt 和 Symbol 之外的所有值。
%f - parseFloat(value) 用于除 BigInt 和 Symbol 之外的所有值。
%j - JSON。如果参数包含循环引用,则替换为字符串 '[Circular]'。
%o - Object。具有通用 JavaScript 对象格式的对象的字符串表示形式。 类似于带有选项 { showHidden: true, showProxy: true } 的 util.inspect()。 这将显示完整对象,包括非可枚举属性和代理。
%O - Object。具有通用 JavaScript 对象格式的对象的字符串表示形式。 类似于 util.inspect() 但没有选项。 这将显示完整对象,不包括非可枚举属性和代理。
%c - CSS。该说明符当前会被忽略,将会跳过任何传入的 CSS。
%% - 单个百分号('%')。这不会消耗参数。
返回: <string> 格式化的字符串。
如果占位符没有对应的参数,则占位符不被替换。

如果占位符没有对应的参数,则占位符不被替换。

util.format('%s:%s', 'foo');
// 返回: 'foo:%s'

 

如果类型不是 string,则使用 util.inspect() 格式化不属于格式字符串的值。

如果传入 util.format() 方法的参数比占位符的数量多,则多出的参数会被强制转换为字符串,然后拼接到返回的字符串,参数之间用一个空格分隔。

util.format('%s:%s', 'foo', 'bar', 'baz');
// 返回: 'foo:bar baz'

 如果第一个参数不是一个字符串,则 util.format() 返回一个所有参数用空格分隔并连在一起的字符串。

 

util.format(1, 2, 3);
// 返回: '1 2 3'

如果只有一个参数传给 util.format(),它将按原样返回,不带任何格式: 

util.format('%% %s');
// 返回: '%% %s'

 util.format() 是一种用作调试工具的同步方法。 某些输入值可能会产生严重的性能开销,从而阻止事件循环。 请谨慎使用此功能,切勿在热代码路径中使用。

util.formatWithOptions(inspectOptions, format[, ...args])

 

inspectOptions <对象>
format <string>
此函数与相同util.format(),不同之处在于它接受inspectOptions指定传递给的选项的参数 util.inspect()。
util.formatWithOptions({ colors: true }, 'See object %O', { foo: 42 });
// Returns 'See object { foo: 42 }', where `42` is colored as a number
// when printed to a terminal.

 

util.getSystemErrorName(err)

返回来自Node.js API的数字错误代码的字符串名称。错误代码和错误名称之间的映射取决于平台。有关常见错误的名称,请参见“ 常见系统错误 ”。

fs.access('file/that/does/not/exist', (err) => {
  const name = util.getSystemErrorName(err.errno);
  console.error(name);  // ENOENT
});

util.inspect(object[, options])

util.inspect(object[, showHidden[, depth[, colors]]])

object <any>任何JavaScript原语或Object。
options <对象>

showHidden <boolean>如果为true,object则格式化结果中将包含的不可枚举的符号和属性。WeakMap和 WeakSet条目也包括在内。默认值: false。
depth <number>指定格式化时递归的次数 object。这对于检查大型物体很有用。要递归到最大调用堆栈大小,请通过Infinity或null。 默认值: 2。
colors <boolean>如果为true,则输出使用ANSI颜色代码设置样式。颜色是可定制的。请参阅自定义util.inspect颜色。 默认值: false。
customInspect <boolean>如果为false, [util.inspect.custom](depth, opts)则不调用函数。 默认值: true。
showProxy <boolean>如果为true,则Proxy检查包括target和handler对象。默认值: false。
maxArrayLength <整数>指定的最大数量Array, TypedArray,WeakMap和WeakSet元素在格式化时为包括。设置为null或Infinity显示所有元素。设置为0或否可以不显示任何元素。默认值: 100。
breakLength <整数>输入值跨多行分割的长度。设置为Infinity将输入格式化为单行(结合compact设置为true或任意数字> = 1)。 默认值: 80。
compact <布尔值> | <integer>将此设置为false会使每个对象键显示在新行上。还会在文本中添加长于的新行breakLength。如果设置为数字,则n只要所有属性都适合,则最内部的元素将合并在一行上 breakLength。短数组元素也被分组在一起。无论breakLength大小如何,文本都不会减少到16个字符以下。有关更多信息,请参见下面的示例。默认值: 3。
sorted <布尔值> | <Function>如果设置为true或function,则对象的所有属性Set以及Map条目将在结果字符串中排序。如果设置为true在默认的排序被使用。如果设置为功能,则用作比较功能。
getters <布尔值> | <string>如果设置为true,将检查吸气剂。如果设置为'get',则仅检查没有相应设置器的吸气剂。如果设置为'set',则仅检查具有相应设置器的吸气剂。这可能会导致副作用,具体取决于吸气剂功能。 默认值: false。
返回:<string>的表示形式object。

util.inspect()方法返回object用于调试的字符串表示形式。的输出util.inspect可能随时更改,因此不应以编程方式依赖它的输出。options可能会传递其他更改结果的信息。 util.inspect()将使用构造函数的名称和/或@@toStringTag为检查的值制作一个可识别的标签。

自定义 util.inspect 的颜色

可以通过 util.inspect.styles 和 util.inspect.colors 属性全局地自定义 util.inspect 的颜色输出(如果已启用)。

util.inspect.styles 是一个映射,关联一个样式名到一个 util.inspect.colors 颜色。

默认的样式与关联的颜色有:

bigint - yellow
boolean - yellow
date - magenta
module - underline
name -(无样式)
null - bold
number - yellow
regexp - red
special - cyan (例如 Proxies)
string - green
symbol - green
undefined - grey
预定义的颜色代码有:white、 grey、 black、 blue、 cyan、 green、 magenta、 red 和 yellow。 还有 bold、 italic、 underline 和 inverse 代码。

颜色样式使用 ANSI 控制码,可能不是所有终端都支持。 要验证颜色支持,请使用 tty.hasColors()。

自定义对象的查看函数

对象可以定义自己的 [util.inspect.custom](depth, opts) 函数, util.inspect() 会调用并使用查看对象时的结果:

const util = require('util');

class Box {
  constructor(value) {
    this.value = value;
  }

  [util.inspect.custom](depth, options) {
    if (depth < 0) {
      return options.stylize('[Box]', 'special');
    }

    const newOptions = Object.assign({}, options, {
      depth: options.depth === null ? null : options.depth - 1
    });

    // 五个空格的填充,因为那是 "Box< " 的大小。
    const padding = ' '.repeat(5);
    const inner = util.inspect(this.value, newOptions)
                      .replace(/\n/g, `\n${padding}`);
    return `${options.stylize('Box', 'special')}< ${inner} >`;
  }
}

const box = new Box(true);

util.inspect(box);
// 返回: "Box< true >"

自定义的 [util.inspect.custom](depth, opts) 函数通常返回一个字符串,但也可以返回一个任何类型的值,它会相应地被 util.inspect() 格式化。

<span style="color:#333333"><code class="language-js"><span style="color:#333388">const</span> util <span style="color:#333333">=</span> require<span style="color:#333333">(</span><span style="color:#e54305">'util'</span><span style="color:#333333">);</span>

<span style="color:#333388">const</span> obj <span style="color:#333333">=</span> <span style="color:#333333">{</span> foo<span style="color:#333333">:</span> <span style="color:#e54305">'这个不会出现在 inspect() 的输出中'</span> <span style="color:#333333">}</span><span style="color:#333333">;</span>
obj<span style="color:#333333">[</span>util<span style="color:#333333">.</span>inspect<span style="color:#333333">.</span>custom<span style="color:#333333">]</span> <span style="color:#333333">=</span> <span style="color:#333333">(</span>depth<span style="color:#333333">)</span> <span style="color:#333333">=></span> <span style="color:#333333">{</span>
  <span style="color:#333388">return</span> <span style="color:#333333">{</span> bar<span style="color:#333333">:</span> <span style="color:#e54305">'baz'</span> <span style="color:#333333">}</span><span style="color:#333333">;</span>
<span style="color:#333333">}</span><span style="color:#333333">;</span>

util<span style="color:#333333">.</span>inspect<span style="color:#333333">(</span>obj<span style="color:#333333">);</span>
<span style="color:#666666">// 返回: "{ bar: 'baz' }"</span></code></span>

 

util.inspect.custom

util.inspect.defaultOptions

util.isDeepStrictEqual(val1, val2)

util.promisify(original)

自定义的 promise 化函数

util.promisify.custom

 

卡顿