Утилиты
Исходный код: lib/util.js
Модуль node:util поддерживает потребности внутренних API Node.js. Многие утилиты также полезны разработчикам приложений и модулей. Чтобы получить к нему доступ:
Модули JavaScript
import util from 'node:util';
CommonJS
const util = require('node:util');
util.callbackify(original)
-
original<Function> Функцияasync - Возвращает: <Function> функция в стиле обратного вызова
Принимает функцию async (или функцию, возвращающую Promise) и возвращает функцию, следующую стилю обратного вызова с обработкой ошибки первым аргументом, то есть принимающую обратный вызов (err, value) => ... в качестве последнего аргумента. В обратном вызове первым аргументом будет причина отклонения (или null, если Promise выполнен успешно), а вторым аргументом — возвращённое значение.
Модули JavaScript
import { callbackify } from 'node:util';
async function fn() {
return 'hello world';
}
const callbackFunction = callbackify(fn);
callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});CommonJS
const { callbackify } = require('node:util');
async function fn() {
return 'hello world';
}
const callbackFunction = callbackify(fn);
callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});Выведет:
hello world copy
Обратный вызов выполняется асинхронно, и трассировка стека будет ограниченной. Если обратный вызов выбросит исключение, процесс сгенерирует событие 'uncaughtException' и завершится, если это событие не будет обработано.
Поскольку null имеет особое значение в качестве первого аргумента обратного вызова, если обёрнутая функция отклоняет Promise с ложным значением в качестве причины, это значение помещается в Error, а исходное значение сохраняется в поле с именем reason.
function fn() {
return Promise.reject(null);
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
// When the Promise was rejected with `null` it is wrapped with an Error and
// the original value is stored in `reason`.
err && Object.hasOwn(err, 'reason') && err.reason === null; // true
}); copy
util.convertProcessSignalToExitCode(signalCode)
-
signalCode<string> Имя сигнала (например,'SIGTERM','SIGKILL'). - Возвращает: <number> | <null> Код завершения или
null, если сигнал недопустим.
Метод util.convertProcessSignalToExitCode() преобразует имя сигнала в соответствующий код завершения POSIX. Согласно стандарту POSIX, код завершения процесса, завершённого сигналом, вычисляется как 128 + signal number.
Модули JavaScript
import { convertProcessSignalToExitCode } from 'node:util';
console.log(convertProcessSignalToExitCode('SIGTERM')); // 143 (128 + 15)
console.log(convertProcessSignalToExitCode('SIGKILL')); // 137 (128 + 9)
console.log(convertProcessSignalToExitCode('INVALID')); // nullCommonJS
const { convertProcessSignalToExitCode } = require('node:util');
console.log(convertProcessSignalToExitCode('SIGTERM')); // 143 (128 + 15)
console.log(convertProcessSignalToExitCode('SIGKILL')); // 137 (128 + 9)
console.log(convertProcessSignalToExitCode('INVALID')); // nullЭто особенно полезно при работе с процессами, чтобы определить код завершения на основе сигнала, завершившего процесс.
util.debuglog(section[, callback])
-
section<string> Строка, указывающая часть приложения, для которой создаётся функцияdebuglog. -
callback<Function> Функция обратного вызова, вызываемая при первом вызове функции журналирования с аргументом-функцией, представляющим собой более оптимизированную функцию журналирования. - Возвращает: <Function> Функция журналирования
Метод util.debuglog() используется для создания функции, которая условно записывает отладочные сообщения в stderr в зависимости от наличия переменной окружения NODE_DEBUG. Если имя section содержится в значении этой переменной окружения, возвращённая функция работает аналогично console.error(). В противном случае возвращённая функция ничего не делает.
Модули JavaScript
import { debuglog } from 'node:util';
const log = debuglog('foo');
log('hello from foo [%d]', 123);CommonJS
const { debuglog } = require('node:util');
const log = debuglog('foo');
log('hello from foo [%d]', 123);Если эта программа запущена с NODE_DEBUG=foo в окружении, она выведет примерно следующее:
FOO 3245: hello from foo [123] copy
где 3245 — идентификатор процесса. Если программа запущена без этой переменной окружения, она ничего не выведет.
Метод section также поддерживает подстановочные знаки:
Модули JavaScript
import { debuglog } from 'node:util';
const log = debuglog('foo-bar');
log('hi there, it\'s foo-bar [%d]', 2333);CommonJS
const { debuglog } = require('node:util');
const log = debuglog('foo-bar');
log('hi there, it\'s foo-bar [%d]', 2333);если программа запущена с NODE_DEBUG=foo* в окружении, она выведет примерно следующее:
FOO-BAR 3257: hi there, it's foo-bar [2333] copy
В переменной окружения NODE_DEBUG можно указать несколько имён section, разделённых запятыми: NODE_DEBUG=fs,net,tls.
Необязательный аргумент callback можно использовать, чтобы заменить функцию журналирования другой функцией, не требующей инициализации или ненужного обёртывания.
Модули JavaScript
import { debuglog } from 'node:util';
let log = debuglog('internals', (debug) => {
// Replace with a logging function that optimizes out
// testing if the section is enabled
log = debug;
});CommonJS
const { debuglog } = require('node:util');
let log = debuglog('internals', (debug) => {
// Replace with a logging function that optimizes out
// testing if the section is enabled
log = debug;
});
debuglog().enabled
- Тип: <boolean>
Геттер util.debuglog().enabled используется для создания проверки, которую можно применять в условных выражениях в зависимости от наличия переменной окружения NODE_DEBUG. Если имя section содержится в значении этой переменной окружения, возвращаемое значение будет true. В противном случае возвращаемое значение будет false.
Модули JavaScript
import { debuglog } from 'node:util';
const enabled = debuglog('foo').enabled;
if (enabled) {
console.log('hello from foo [%d]', 123);
}CommonJS
const { debuglog } = require('node:util');
const enabled = debuglog('foo').enabled;
if (enabled) {
console.log('hello from foo [%d]', 123);
}Если эта программа запущена с NODE_DEBUG=foo в окружении, она выведет примерно следующее:
hello from foo [123] copy
util.debug(section)
Псевдоним для util.debuglog. Использование повышает читаемость и не подразумевает журналирование, если применяется только util.debuglog().enabled.
util.deprecate(fn, msg[, code[, options]])
-
fn<Function> Функция, объявляемая устаревшей. -
msg<string> Предупреждение, которое будет выведено при вызове устаревшей функции. -
code<string> Код устаревания. Список кодов см. в списке устаревших API. -
options<Object>-
modifyPrototype<boolean> Если значение равно false, не изменять прототип объекта при выводе предупреждения об устаревании. По умолчанию:true.
-
- Возвращает: <Function> Устаревшая функция, обёрнутая для вывода предупреждения.
Метод util.deprecate() оборачивает fn (который может быть функцией или классом), помечая его как устаревший.
Модули JavaScript
import { deprecate } from 'node:util';
export const obsoleteFunction = deprecate(() => {
// Do something here.
}, 'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');CommonJS
const { deprecate } = require('node:util');
exports.obsoleteFunction = deprecate(() => {
// Do something here.
}, 'obsoleteFunction() is deprecated. Use newShinyFunction() instead.');При вызове util.deprecate() возвращает функцию, которая генерирует DeprecationWarning с помощью события 'warning'. Предупреждение будет сгенерировано и выведено в stderr при первом вызове возвращённой функции. После вывода предупреждения обёрнутая функция вызывается без генерации предупреждения.
Если один и тот же необязательный code передаётся в нескольких вызовах util.deprecate(), предупреждение будет выведено только один раз для этого code.
Модули JavaScript
import { deprecate } from 'node:util';
const fn1 = deprecate(
() => 'a value',
'deprecation message',
'DEP0001',
);
const fn2 = deprecate(
() => 'a different value',
'other dep message',
'DEP0001',
);
fn1(); // Emits a deprecation warning with code DEP0001
fn2(); // Does not emit a deprecation warning because it has the same codeCommonJS
const { deprecate } = require('node:util');
const fn1 = deprecate(
function() {
return 'a value';
},
'deprecation message',
'DEP0001',
);
const fn2 = deprecate(
function() {
return 'a different value';
},
'other dep message',
'DEP0001',
);
fn1(); // Emits a deprecation warning with code DEP0001
fn2(); // Does not emit a deprecation warning because it has the same codeЕсли используются флаги командной строки --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.diff(actual, expected)
-
Возвращает: <Array> Массив записей различий. Каждая запись — это массив из двух элементов:
-
Сложность алгоритма: O(N*D), где:
-
N — общая длина двух последовательностей (N = actual.length + expected.length)
-
D — расстояние редактирования (минимальное число операций, необходимых для преобразования одной последовательности в другую).
util.diff() сравнивает два строковых значения или два массива и возвращает массив записей различий. Для вычисления минимальных различий используется алгоритм diff Майерса — тот же алгоритм, который применяется внутри сообщений об ошибках утверждений.
Если значения равны, возвращается пустой массив.
const { diff } = require('node:util');
// Comparing strings
const actualString = '12345678';
const expectedString = '12!!5!7!';
console.log(diff(actualString, expectedString));
// [
// [0, '1'],
// [0, '2'],
// [1, '3'],
// [1, '4'],
// [-1, '!'],
// [-1, '!'],
// [0, '5'],
// [1, '6'],
// [-1, '!'],
// [0, '7'],
// [1, '8'],
// [-1, '!'],
// ]
// Comparing arrays
const actualArray = ['1', '2', '3'];
const expectedArray = ['1', '3', '4'];
console.log(diff(actualArray, expectedArray));
// [
// [0, '1'],
// [1, '2'],
// [0, '3'],
// [-1, '4'],
// ]
// Equal values return empty array
console.log(diff('same', 'same'));
// [] copy
util.format(format[, ...args])
-
format<string> Строка формата в стилеprintf.
Метод util.format() возвращает отформатированную строку, используя первый аргумент в качестве строки формата в стиле printf, которая может содержать ноль или более спецификаторов формата. Каждый спецификатор заменяется преобразованным значением соответствующего аргумента. Поддерживаются следующие спецификаторы:
-
%s:Stringиспользуется для преобразования всех значений, кромеBigInt,Objectи-0. ЗначенияBigIntпредставляются в видеn, а объекты, у которых нет ни пользовательской функцииtoString, ни функцииSymbol.toPrimitive, исследуются с помощьюutil.inspect()с параметрами{ depth: 0, colors: false, compact: 3 }. -
%d:Numberиспользуется для преобразования всех значений, кромеBigIntиSymbol. -
%i:parseInt(value, 10)используется для всех значений, кромеBigIntиSymbol. -
%f:parseFloat(value)используется для всех значений, кромеSymbol. -
%j: JSON. Заменяется строкой'[Circular]', если аргумент содержит циклические ссылки. -
%o:Object. Строковое представление объекта с обычным форматированием объектов JavaScript. Аналогичноutil.inspect()с параметрами{ showHidden: true, showProxy: true }. Отображает весь объект, включая неперечисляемые свойства и прокси. -
%O:Object. Строковое представление объекта с обычным форматированием объектов JavaScript. Аналогичноutil.inspect()без параметров. Отображает весь объект, не включая неперечисляемые свойства и прокси. -
%c:CSS. Этот спецификатор игнорируется, а переданный CSS пропускается. -
%%: знак процента ('%'). Аргумент не используется. - Возвращает: <string> Отформатированная строка
Если для спецификатора нет соответствующего аргумента, он не заменяется:
util.format('%s:%s', 'foo');
// Returns: 'foo:%s' copy Значения, не входящие в строку формата, форматируются с помощью util.inspect(), если их тип не string.
Если методу util.format() передано больше аргументов, чем имеется спецификаторов, лишние аргументы добавляются к возвращаемой строке через пробелы:
util.format('%s:%s', 'foo', 'bar', 'baz');
// Returns: 'foo:bar baz' copy Если первый аргумент не содержит допустимого спецификатора формата, util.format() возвращает строку, составленную из всех аргументов, разделённых пробелами:
util.format(1, 2, 3); // Returns: '1 2 3' copy
Если методу util.format() передан только один аргумент, он возвращается без изменений и форматирования:
util.format('%% %s');
// Returns: '%% %s' copy util.format() — синхронный метод, предназначенный для отладки. Обработка некоторых входных значений может существенно нагружать процессор и блокировать цикл событий. Используйте эту функцию осторожно и никогда не вызывайте её в критически важном для производительности коде.
util.formatWithOptions(inspectOptions, format[, ...args])
Эта функция идентична 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. copy
util.getCallSites([frameCount][, options])
-
frameCount<number> Необязательное число кадров для захвата в виде объектов call site. По умолчанию:10. Допустимый диапазон — от 1 до 200. -
options<Object> Необязательный параметр-
sourceMap<boolean> Восстановить исходное расположение в трассировке стека на основе source map. По умолчанию включено с флагом--enable-source-maps.
-
- Возвращает: <Object[]> Массив объектов call site
-
functionName<string> Возвращает имя функции, связанной с этим call site. -
scriptName<string> Возвращает имя ресурса, содержащего скрипт функции для этого call site. -
scriptId<string> Возвращает уникальный идентификатор скрипта, используемый, например, в протоколе Chrome DevToolsRuntime.ScriptId. -
lineNumber<number> Возвращает номер строки скрипта JavaScript (начиная с 1). -
columnNumber<number> Возвращает номер столбца скрипта JavaScript (начиная с 1).
-
Возвращает массив объектов call site, содержащих стек вызывающей функции.
В отличие от доступа к error.stack, результат, возвращаемый этим API, не изменяется под воздействием Error.prepareStackTrace.
Модули JavaScript
import { getCallSites } from 'node:util';
function exampleFunction() {
const callSites = getCallSites();
console.log('Call Sites:');
callSites.forEach((callSite, index) => {
console.log(`CallSite ${index + 1}:`);
console.log(`Function Name: ${callSite.functionName}`);
console.log(`Script Name: ${callSite.scriptName}`);
console.log(`Line Number: ${callSite.lineNumber}`);
console.log(`Column Number: ${callSite.columnNumber}`);
});
// CallSite 1:
// Function Name: exampleFunction
// Script Name: /home/example.js
// Line Number: 5
// Column Number: 26
// CallSite 2:
// Function Name: anotherFunction
// Script Name: /home/example.js
// Line Number: 22
// Column Number: 3
// ...
}
// A function to simulate another stack layer
function anotherFunction() {
exampleFunction();
}
anotherFunction();CommonJS
const { getCallSites } = require('node:util');
function exampleFunction() {
const callSites = getCallSites();
console.log('Call Sites:');
callSites.forEach((callSite, index) => {
console.log(`CallSite ${index + 1}:`);
console.log(`Function Name: ${callSite.functionName}`);
console.log(`Script Name: ${callSite.scriptName}`);
console.log(`Line Number: ${callSite.lineNumber}`);
console.log(`Column Number: ${callSite.columnNumber}`);
});
// CallSite 1:
// Function Name: exampleFunction
// Script Name: /home/example.js
// Line Number: 5
// Column Number: 26
// CallSite 2:
// Function Name: anotherFunction
// Script Name: /home/example.js
// Line Number: 22
// Column Number: 3
// ...
}
// A function to simulate another stack layer
function anotherFunction() {
exampleFunction();
}
anotherFunction();Исходные местоположения можно восстановить, установив для параметра sourceMap значение true. Если source map недоступна, исходное местоположение совпадает с текущим. Если включён флаг --enable-source-maps, например при использовании --experimental-transform-types, sourceMap по умолчанию будет иметь значение true.
import { getCallSites } from 'node:util';
interface Foo {
foo: string;
}
const callSites = getCallSites({ sourceMap: true });
// With sourceMap:
// Function Name: ''
// Script Name: example.js
// Line Number: 7
// Column Number: 26
// Without sourceMap:
// Function Name: ''
// Script Name: example.js
// Line Number: 2
// Column Number: 26 copy const { getCallSites } = require('node:util');
const callSites = getCallSites({ sourceMap: true });
// With sourceMap:
// Function Name: ''
// Script Name: example.js
// Line Number: 7
// Column Number: 26
// Without sourceMap:
// Function Name: ''
// Script Name: example.js
// Line Number: 2
// Column Number: 26 copy
util.getSystemErrorName(err)
Возвращает строковое имя числового кода ошибки, полученного из API Node.js. Соответствие между кодами ошибок и их именами зависит от платформы. Названия распространённых ошибок см. в разделе Распространённые системные ошибки.
fs.access('file/that/does/not/exist', (err) => {
const name = util.getSystemErrorName(err.errno);
console.error(name); // ENOENT
}); copy
util.getSystemErrorMap()
- Возвращает: <Map>
Возвращает Map всех кодов системных ошибок, доступных в API Node.js. Соответствие между кодами ошибок и их именами зависит от платформы. Названия распространённых ошибок см. в разделе Распространённые системные ошибки.
fs.access('file/that/does/not/exist', (err) => {
const errorMap = util.getSystemErrorMap();
const name = errorMap.get(err.errno);
console.error(name); // ENOENT
}); copy
util.getSystemErrorMessage(err)
Возвращает текстовое сообщение для числового кода ошибки, полученного из API Node.js. Соответствие между кодами ошибок и текстовыми сообщениями зависит от платформы.
fs.access('file/that/does/not/exist', (err) => {
const message = util.getSystemErrorMessage(err.errno);
console.error(message); // No such file or directory
}); copy
util.setTraceSigInt(enable)
-
enable<boolean>
Включает или отключает вывод трассировки стека при SIGINT. API доступен только в основном потоке.
util.inherits(constructor, superConstructor)
extends.-
constructor<Function> -
superConstructor<Function>
Использовать util.inherits() не рекомендуется. Для поддержки наследования на уровне языка используйте ключевые слова ES6 class и extends. Также обратите внимание, что эти два стиля семантически несовместимы.
Наследует методы прототипа одного конструктора другим. Прототип constructor будет заменён новым объектом, созданным на основе superConstructor.
Этот метод в основном добавляет проверку входных данных поверх Object.setPrototypeOf(constructor.prototype, superConstructor.prototype). Кроме того, superConstructor будет доступен через свойство constructor.super_.
const util = require('node:util');
const EventEmitter = require('node:events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
};
const stream = new MyStream();
console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('It works!'); // Received data: "It works!" copy Пример ES6 с использованием class и extends:
Модули JavaScript
import EventEmitter from 'node:events';
class MyStream extends EventEmitter {
write(data) {
this.emit('data', data);
}
}
const stream = new MyStream();
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('With ES6');CommonJS
const EventEmitter = require('node:events');
class MyStream extends EventEmitter {
write(data) {
this.emit('data', data);
}
}
const stream = new MyStream();
stream.on('data', (data) => {
console.log(`Received data: "${data}"`);
});
stream.write('With ES6');
util.inspect(object[, options])
util.inspect(object[, showHidden[, depth[, colors]]])
-
object<any> Любое примитивное значение JavaScript илиObject. -
options<Object>-
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, inspect)не вызываются. По умолчанию:true. -
showProxy<boolean> Если значение равноtrue, проверкаProxyвключает объектыtargetиhandler. По умолчанию:false. -
maxArrayLength<integer> Задаёт максимальное количество элементовArray, <TypedArray>, <Map>, <WeakMap> и <WeakSet>, включаемых при форматировании. Установите значениеnullилиInfinity, чтобы показать все элементы. Установите значение0или отрицательное число, чтобы не показывать элементы. По умолчанию:100. -
maxStringLength<integer> Задаёт максимальное количество символов, включаемых при форматировании. Установите значениеnullилиInfinity, чтобы показать все элементы. Установите значение0или отрицательное число, чтобы не показывать символы. По умолчанию:10000. -
breakLength<integer> Длина, при превышении которой входные значения разбиваются на несколько строк. Установите значениеInfinity, чтобы форматировать входные данные в одну строку (в сочетании сcompact, установленным вtrueили любое число >=1). По умолчанию:80. -
compact<boolean> | <integer> Если установить значениеfalse, каждый ключ объекта будет отображаться на новой строке. Текст, длина которого превышаетbreakLength, будет переноситься на новые строки. Если задано число, самые внутренние элементы уровняnобъединяются в одну строку, если все свойства помещаются вbreakLength. Короткие элементы массива также группируются. Дополнительные сведения см. в примере ниже. По умолчанию:3. -
sorted<boolean> | <Function> Если задано значениеtrueили функция, все свойства объекта, а также элементыSetиMapсортируются в результирующей строке. Если задано значениеtrue, используется сортировка по умолчанию. Если задана функция, она используется как функция сравнения. -
getters<boolean> | <string> Если задано значениеtrue, проверяются геттеры. Если задано значение'get', проверяются только геттеры без соответствующего сеттера. Если задано значение'set', проверяются только геттеры с соответствующим сеттером. В зависимости от функции геттера это может привести к побочным эффектам. По умолчанию:false. -
numericSeparator<boolean> Если задано значениеtrue, в больших целых числах и числах между каждыми тремя цифрами ставится подчёркивание. По умолчанию:false.
-
- Возвращает: <string> Представление
object.
Метод util.inspect() возвращает строковое представление object, предназначенное для отладки. Вывод util.inspect может измениться в любой момент, поэтому не следует программно полагаться на него. Можно передать дополнительные options, которые изменят результат. util.inspect() использует имя конструктора и/или свойство Symbol.toStringTag, чтобы создать узнаваемую метку для проверяемого значения.
class Foo {
get [Symbol.toStringTag]() {
return 'bar';
}
}
class Bar {}
const baz = Object.create(null, { [Symbol.toStringTag]: { value: 'foo' } });
util.inspect(new Foo()); // 'Foo [bar] {}'
util.inspect(new Bar()); // 'Bar {}'
util.inspect(baz); // '[foo] {}' copy Циклические ссылки указывают на свою исходную точку с помощью индекса ссылки:
Модули JavaScript
import { inspect } from 'node:util';
const obj = {};
obj.a = [obj];
obj.b = {};
obj.b.inner = obj.b;
obj.b.obj = obj;
console.log(inspect(obj));
// <ref *1> {
// a: [ [Circular *1] ],
// b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }
// }CommonJS
const { inspect } = require('node:util');
const obj = {};
obj.a = [obj];
obj.b = {};
obj.b.inner = obj.b;
obj.b.obj = obj;
console.log(inspect(obj));
// <ref *1> {
// a: [ [Circular *1] ],
// b: <ref *2> { inner: [Circular *2], obj: [Circular *1] }
// }В следующем примере проверяются все свойства объекта util:
Модули JavaScript
import util from 'node:util';
console.log(util.inspect(util, { showHidden: true, depth: null }));CommonJS
const util = require('node:util');
console.log(util.inspect(util, { showHidden: true, depth: null }));В следующем примере показано влияние параметра compact:
Модули JavaScript
import { inspect } from 'node:util';
const o = {
a: [1, 2, [[
'Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' +
'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.',
'test',
'foo']], 4],
b: new Map([['za', 1], ['zb', 'test']]),
};
console.log(inspect(o, { compact: true, depth: 5, breakLength: 80 }));
// { a:
// [ 1,
// 2,
// [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line
// 'test',
// 'foo' ] ],
// 4 ],
// b: Map(2) { 'za' => 1, 'zb' => 'test' } }
// Setting `compact` to false or an integer creates more reader friendly output.
console.log(inspect(o, { compact: false, depth: 5, breakLength: 80 }));
// {
// a: [
// 1,
// 2,
// [
// [
// 'Lorem ipsum dolor sit amet,\n' +
// 'consectetur adipiscing elit, sed do eiusmod \n' +
// 'tempor incididunt ut labore et dolore magna aliqua.',
// 'test',
// 'foo'
// ]
// ],
// 4
// ],
// b: Map(2) {
// 'za' => 1,
// 'zb' => 'test'
// }
// }
// Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a
// single line.CommonJS
const { inspect } = require('node:util');
const o = {
a: [1, 2, [[
'Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit, sed do ' +
'eiusmod \ntempor incididunt ut labore et dolore magna aliqua.',
'test',
'foo']], 4],
b: new Map([['za', 1], ['zb', 'test']]),
};
console.log(inspect(o, { compact: true, depth: 5, breakLength: 80 }));
// { a:
// [ 1,
// 2,
// [ [ 'Lorem ipsum dolor sit amet,\nconsectetur [...]', // A long line
// 'test',
// 'foo' ] ],
// 4 ],
// b: Map(2) { 'za' => 1, 'zb' => 'test' } }
// Setting `compact` to false or an integer creates more reader friendly output.
console.log(inspect(o, { compact: false, depth: 5, breakLength: 80 }));
// {
// a: [
// 1,
// 2,
// [
// [
// 'Lorem ipsum dolor sit amet,\n' +
// 'consectetur adipiscing elit, sed do eiusmod \n' +
// 'tempor incididunt ut labore et dolore magna aliqua.',
// 'test',
// 'foo'
// ]
// ],
// 4
// ],
// b: Map(2) {
// 'za' => 1,
// 'zb' => 'test'
// }
// }
// Setting `breakLength` to e.g. 150 will print the "Lorem ipsum" text in a
// single line.Параметр showHidden позволяет проверять элементы <WeakMap> и <WeakSet>. Если элементов больше, чем maxArrayLength, нельзя гарантировать, какие именно элементы будут показаны. Это означает, что при повторном получении тех же элементов <WeakSet> результат может отличаться. Кроме того, элементы, на которые больше не осталось сильных ссылок, могут быть удалены сборщиком мусора в любой момент.
Модули JavaScript
import { inspect } from 'node:util';
const obj = { a: 1 };
const obj2 = { b: 2 };
const weakSet = new WeakSet([obj, obj2]);
console.log(inspect(weakSet, { showHidden: true }));
// WeakSet { { a: 1 }, { b: 2 } }CommonJS
const { inspect } = require('node:util');
const obj = { a: 1 };
const obj2 = { b: 2 };
const weakSet = new WeakSet([obj, obj2]);
console.log(inspect(weakSet, { showHidden: true }));
// WeakSet { { a: 1 }, { b: 2 } }Параметр sorted гарантирует, что порядок добавления свойств объекта не влияет на результат util.inspect().
Модули JavaScript
import { inspect } from 'node:util';
import assert from 'node:assert';
const o1 = {
b: [2, 3, 1],
a: '`a` comes before `b`',
c: new Set([2, 3, 1]),
};
console.log(inspect(o1, { sorted: true }));
// { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }
console.log(inspect(o1, { sorted: (a, b) => b.localeCompare(a) }));
// { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' }
const o2 = {
c: new Set([2, 1, 3]),
a: '`a` comes before `b`',
b: [2, 3, 1],
};
assert.strict.equal(
inspect(o1, { sorted: true }),
inspect(o2, { sorted: true }),
);CommonJS
const { inspect } = require('node:util');
const assert = require('node:assert');
const o1 = {
b: [2, 3, 1],
a: '`a` comes before `b`',
c: new Set([2, 3, 1]),
};
console.log(inspect(o1, { sorted: true }));
// { a: '`a` comes before `b`', b: [ 2, 3, 1 ], c: Set(3) { 1, 2, 3 } }
console.log(inspect(o1, { sorted: (a, b) => b.localeCompare(a) }));
// { c: Set(3) { 3, 2, 1 }, b: [ 2, 3, 1 ], a: '`a` comes before `b`' }
const o2 = {
c: new Set([2, 1, 3]),
a: '`a` comes before `b`',
b: [2, 3, 1],
};
assert.strict.equal(
inspect(o1, { sorted: true }),
inspect(o2, { sorted: true }),
);Параметр numericSeparator добавляет подчёркивание после каждых трёх цифр во всех числах.
Модули JavaScript
import { inspect } from 'node:util';
const thousand = 1000;
const million = 1000000;
const bigNumber = 123456789n;
const bigDecimal = 1234.12345;
console.log(inspect(thousand, { numericSeparator: true }));
// 1_000
console.log(inspect(million, { numericSeparator: true }));
// 1_000_000
console.log(inspect(bigNumber, { numericSeparator: true }));
// 123_456_789n
console.log(inspect(bigDecimal, { numericSeparator: true }));
// 1_234.123_45CommonJS
const { inspect } = require('node:util');
const thousand = 1000;
const million = 1000000;
const bigNumber = 123456789n;
const bigDecimal = 1234.12345;
console.log(inspect(thousand, { numericSeparator: true }));
// 1_000
console.log(inspect(million, { numericSeparator: true }));
// 1_000_000
console.log(inspect(bigNumber, { numericSeparator: true }));
// 123_456_789n
console.log(inspect(bigDecimal, { numericSeparator: true }));
// 1_234.123_45util.inspect() — синхронный метод, предназначенный для отладки. Максимальная длина его вывода составляет примерно 128 МиБ. Входные данные, приводящие к более длинному выводу, будут усечены.
Настройка цветов util.inspect
Цвета вывода util.inspect (если они включены) можно настроить глобально с помощью свойств util.inspect.styles и util.inspect.colors.
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
Для оформления цветов используются управляющие коды ANSI, которые поддерживаются не всеми терминалами. Чтобы проверить поддержку цветов, используйте tty.hasColors().
Предопределённые управляющие коды перечислены ниже (сгруппированы по категориям «Модификаторы», «Цвета переднего плана» и «Цвета фона»).
Модификаторы
Поддержка модификаторов различается в разных терминалах. Если модификатор не поддерживается, он, как правило, игнорируется.
-
reset— сбрасывает все модификаторы (цвета) до значений по умолчанию - bold — делает текст полужирным
- italic — делает текст курсивным
- underline — подчёркивает текст
-
strikethrough— проводит горизонтальную линию через середину текста (синонимы:strikeThrough,crossedout,crossedOut) -
hidden— выводит текст, но делает его невидимым (синоним: conceal) -
dim — уменьшает интенсивность цвета (синоним:
faint) - overlined — проводит черту над текстом
- blink — скрывает и показывает текст через заданные интервалы
-
inverse — меняет местами цвета переднего плана и фона (синонимы:
swapcolors,swapColors) -
doubleunderline — подчёркивает текст двойной линией (синоним:
doubleUnderline) - framed — обводит текст рамкой
Цвета переднего плана
blackredgreenyellowbluemagentacyanwhite-
gray(синонимы:grey,blackBright) redBrightgreenBrightyellowBrightblueBrightmagentaBrightcyanBrightwhiteBright
Цвета фона
bgBlackbgRedbgGreenbgYellowbgBluebgMagentabgCyanbgWhite-
bgGray(синонимы:bgGrey,bgBlackBright) bgRedBrightbgGreenBrightbgYellowBrightbgBlueBrightbgMagentaBrightbgCyanBrightbgWhiteBright
Пользовательские функции проверки объектов
Объекты также могут определять собственную функцию [util.inspect.custom](depth, opts, inspect), которую util.inspect() вызовет при проверке объекта и использует её результат.
Модули JavaScript
import { inspect } from 'node:util';
class Box {
constructor(value) {
this.value = value;
}
[inspect.custom](depth, options, inspect) {
if (depth < 0) {
return options.stylize('[Box]', 'special');
}
const newOptions = Object.assign({}, options, {
depth: options.depth === null ? null : options.depth - 1,
});
// Five space padding because that's the size of "Box< ".
const padding = ' '.repeat(5);
const inner = inspect(this.value, newOptions)
.replace(/\n/g, `\n${padding}`);
return `${options.stylize('Box', 'special')}< ${inner} >`;
}
}
const box = new Box(true);
console.log(inspect(box));
// "Box< true >"CommonJS
const { inspect } = require('node:util');
class Box {
constructor(value) {
this.value = value;
}
[inspect.custom](depth, options, inspect) {
if (depth < 0) {
return options.stylize('[Box]', 'special');
}
const newOptions = Object.assign({}, options, {
depth: options.depth === null ? null : options.depth - 1,
});
// Five space padding because that's the size of "Box< ".
const padding = ' '.repeat(5);
const inner = inspect(this.value, newOptions)
.replace(/\n/g, `\n${padding}`);
return `${options.stylize('Box', 'special')}< ${inner} >`;
}
}
const box = new Box(true);
console.log(inspect(box));
// "Box< true >"Пользовательские функции [util.inspect.custom](depth, opts, inspect) обычно возвращают строку, но могут возвращать значение любого типа, которое util.inspect() отформатирует соответствующим образом.
Модули JavaScript
import { inspect } from 'node:util';
const obj = { foo: 'this will not show up in the inspect() output' };
obj[inspect.custom] = (depth) => {
return { bar: 'baz' };
};
console.log(inspect(obj));
// "{ bar: 'baz' }"CommonJS
const { inspect } = require('node:util');
const obj = { foo: 'this will not show up in the inspect() output' };
obj[inspect.custom] = (depth) => {
return { bar: 'baz' };
};
console.log(inspect(obj));
// "{ bar: 'baz' }"
util.inspect.custom
- Тип: <symbol>, который можно использовать для объявления пользовательских функций проверки.
Помимо доступа через util.inspect.custom, этот символ зарегистрирован глобально и доступен в любой среде как Symbol.for('nodejs.util.inspect.custom').
Это позволяет писать переносимый код: пользовательская функция проверки будет использоваться в среде Node.js и игнорироваться в браузере. Сама функция util.inspect() передаётся пользовательской функции проверки в качестве третьего аргумента, чтобы обеспечить дополнительную переносимость.
const customInspectSymbol = Symbol.for('nodejs.util.inspect.custom');
class Password {
constructor(value) {
this.value = value;
}
toString() {
return 'xxxxxxxx';
}
[customInspectSymbol](depth, inspectOptions, inspect) {
return `Password <${this.toString()}>`;
}
}
const password = new Password('r0sebud');
console.log(password);
// Prints Password <xxxxxxxx> copy Дополнительные сведения см. в разделе Пользовательские функции проверки объектов.
util.inspect.defaultOptions
Значение defaultOptions позволяет настроить параметры по умолчанию, используемые util.inspect. Это полезно для таких функций, как console.log или util.format, которые неявно вызывают util.inspect. Ему следует присвоить объект, содержащий один или несколько допустимых параметров util.inspect(). Также поддерживается непосредственная установка свойств параметров.
Модули JavaScript
import { inspect } from 'node:util';
const arr = Array(156).fill(0);
console.log(arr); // Logs the truncated array
inspect.defaultOptions.maxArrayLength = null;
console.log(arr); // logs the full arrayCommonJS
const { inspect } = require('node:util');
const arr = Array(156).fill(0);
console.log(arr); // Logs the truncated array
inspect.defaultOptions.maxArrayLength = null;
console.log(arr); // logs the full array
util.isDeepStrictEqual(val1, val2[, options])
-
val1<any> -
val2<any> -
skipPrototype<boolean> Если значение равноtrue, сравнение прототипов и конструкторов при проверке глубокой строгой эквивалентности пропускается. По умолчанию:false. - Возвращает: <boolean>
Возвращает true, если val1 и val2 глубоко строго эквивалентны. В противном случае возвращает false.
По умолчанию глубокая строгая эквивалентность включает сравнение прототипов и конструкторов объектов. Если skipPrototype имеет значение true, объекты с разными прототипами или конструкторами всё равно могут считаться равными, если их перечисляемые свойства глубоко строго эквивалентны.
const util = require('node:util');
class Foo {
constructor(a) {
this.a = a;
}
}
class Bar {
constructor(a) {
this.a = a;
}
}
const foo = new Foo(1);
const bar = new Bar(1);
// Different constructors, same properties
console.log(util.isDeepStrictEqual(foo, bar));
// false
console.log(util.isDeepStrictEqual(foo, bar, true));
// true copy Дополнительные сведения о глубокой строгой эквивалентности см. в разделе assert.deepStrictEqual().
Класс: util.MIMEType
Реализация класса MIMEType.
В соответствии с соглашениями браузеров все свойства объектов MIMEType реализованы как геттеры и сеттеры в прототипе класса, а не как свойства данных самого объекта.
Строка MIME — это структурированная строка, содержащая несколько значимых компонентов. При её разборе возвращается объект MIMEType со свойствами для каждого из этих компонентов.
new MIMEType(input)
-
input<string> Входные данные MIME для разбора
Создаёт новый объект MIMEType, разбирая input.
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/plain');CommonJS
const { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/plain');Если input не является допустимым MIME, будет выброшено исключение TypeError. Обратите внимание: предпринимается попытка преобразовать переданные значения в строки. Например:
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIME = new MIMEType({ toString: () => 'text/plain' });
console.log(String(myMIME));
// Prints: text/plainCommonJS
const { MIMEType } = require('node:util');
const myMIME = new MIMEType({ toString: () => 'text/plain' });
console.log(String(myMIME));
// Prints: text/plain
mime.type
- Тип: <string>
Получает и задаёт часть MIME, содержащую тип.
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/javascript');
console.log(myMIME.type);
// Prints: text
myMIME.type = 'application';
console.log(myMIME.type);
// Prints: application
console.log(String(myMIME));
// Prints: application/javascriptCommonJS
const { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/javascript');
console.log(myMIME.type);
// Prints: text
myMIME.type = 'application';
console.log(myMIME.type);
// Prints: application
console.log(String(myMIME));
// Prints: application/javascript
mime.subtype
- Тип: <string>
Получает и задаёт часть MIME, содержащую подтип.
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/ecmascript');
console.log(myMIME.subtype);
// Prints: ecmascript
myMIME.subtype = 'javascript';
console.log(myMIME.subtype);
// Prints: javascript
console.log(String(myMIME));
// Prints: text/javascriptCommonJS
const { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/ecmascript');
console.log(myMIME.subtype);
// Prints: ecmascript
myMIME.subtype = 'javascript';
console.log(myMIME.subtype);
// Prints: javascript
console.log(String(myMIME));
// Prints: text/javascript
mime.essence
- Тип: <string>
Получает основную часть MIME. Это свойство доступно только для чтения. Используйте mime.type или mime.subtype, чтобы изменить MIME.
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIME = new MIMEType('text/javascript;key=value');
console.log(myMIME.essence);
// Prints: text/javascript
myMIME.type = 'application';
console.log(myMIME.essence);
// Prints: application/javascript
console.log(String(myMIME));
// Prints: application/javascript;key=valueCommonJS
const { MIMEType } = require('node:util');
const myMIME = new MIMEType('text/javascript;key=value');
console.log(myMIME.essence);
// Prints: text/javascript
myMIME.type = 'application';
console.log(myMIME.essence);
// Prints: application/javascript
console.log(String(myMIME));
// Prints: application/javascript;key=value
mime.params
- Тип: <MIMEParams>
Получает объект MIMEParams, представляющий параметры MIME. Это свойство доступно только для чтения. Подробности см. в документации MIMEParams.
mime.toString()
- Возвращает: <string>
Метод toString() объекта MIMEType возвращает сериализованную строку MIME.
В целях соблюдения стандартов этот метод не позволяет пользователям настраивать процесс сериализации MIME.
mime.toJSON()
- Возвращает: <string>
Синоним mime.toString().
Этот метод вызывается автоматически, когда объект MIMEType сериализуется с помощью JSON.stringify().
Модули JavaScript
import { MIMEType } from 'node:util';
const myMIMES = [
new MIMEType('image/png'),
new MIMEType('image/gif'),
];
console.log(JSON.stringify(myMIMES));
// Prints: ["image/png", "image/gif"]CommonJS
const { MIMEType } = require('node:util');
const myMIMES = [
new MIMEType('image/png'),
new MIMEType('image/gif'),
];
console.log(JSON.stringify(myMIMES));
// Prints: ["image/png", "image/gif"]Класс: util.MIMEParams
API MIMEParams предоставляет доступ на чтение и запись параметров MIMEType.
new MIMEParams()
Создает новый объект MIMEParams с пустыми параметрами
Модули JavaScript
import { MIMEParams } from 'node:util';
const myParams = new MIMEParams();CommonJS
const { MIMEParams } = require('node:util');
const myParams = new MIMEParams();
mimeParams.entries()
- Возвращает: <Iterator>
Возвращает итератор для каждой пары «имя — значение» в параметрах. Каждый элемент итератора — это массив JavaScript Array. Первый элемент массива — это name, второй элемент массива — это value.
mimeParams.get(name)
-
name<string> - Возвращает: <string> | <null> Строка или
null, если пары «имя — значение» с указаннымnameнет.
Возвращает значение первой пары «имя — значение», имя которой — name. Если таких пар нет, возвращается null.
mimeParams.has(name)
Возвращает true, если существует хотя бы одна пара «имя — значение», имя которой — name.
mimeParams.keys()
- Возвращает: <Iterator>
Возвращает итератор по именам каждой пары «имя — значение».
Модули JavaScript
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=0;bar=1');
for (const name of params.keys()) {
console.log(name);
}
// Prints:
// foo
// barCommonJS
const { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=0;bar=1');
for (const name of params.keys()) {
console.log(name);
}
// Prints:
// foo
// bar
mimeParams.set(name, value)
Устанавливает значение в объекте MIMEParams, связанное с name, равным value. Если уже существуют пары «имя — значение» с именем name, значение первой такой пары устанавливается равным value.
Модули JavaScript
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=0;bar=1');
params.set('foo', 'def');
params.set('baz', 'xyz');
console.log(params.toString());
// Prints: foo=def;bar=1;baz=xyzCommonJS
const { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=0;bar=1');
params.set('foo', 'def');
params.set('baz', 'xyz');
console.log(params.toString());
// Prints: foo=def;bar=1;baz=xyz
mimeParams.values()
- Возвращает: <Iterator>
Возвращает итератор по значениям каждой пары «имя — значение».
mimeParams[Symbol.iterator]()
- Возвращает: <Iterator>
Псевдоним для mimeParams.entries().
Модули JavaScript
import { MIMEType } from 'node:util';
const { params } = new MIMEType('text/plain;foo=bar;xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Prints:
// foo bar
// xyz bazCommonJS
const { MIMEType } = require('node:util');
const { params } = new MIMEType('text/plain;foo=bar;xyz=baz');
for (const [name, value] of params) {
console.log(name, value);
}
// Prints:
// foo bar
// xyz baz
util.parseArgs([config])
-
config<Object> Используется для передачи аргументов для разбора и настройки анализатора.configподдерживает следующие свойства:-
args<string[]> массив строк аргументов. По умолчанию:process.argvбезexecPathиfilename. -
options<Object> Используется для описания аргументов, известных анализатору. Ключиoptions— это длинные имена параметров, а значения — объекты <Object>, поддерживающие следующие свойства:-
type<string> Тип аргумента, который должен быть либоboolean, либоstring. -
multiple<boolean> Может ли этот параметр быть указан несколько раз. Еслиtrue, все значения будут собраны в массив. Еслиfalse, для параметра используется последнее указанное значение. По умолчанию:false. -
short<string> Односимвольный псевдоним параметра. -
default<string> | <boolean> | <string[]> | <boolean[]> Значение, назначаемое параметру, если он отсутствует среди разбираемых аргументов. Значение должно соответствовать типу, указанному в свойствеtype. Еслиmultipleимеет значениеtrue, это должен быть массив. Значение по умолчанию не применяется, если параметр присутствует среди разбираемых аргументов, даже если переданное значение является ложным.
-
-
strict<boolean> Следует ли вызывать ошибку при обнаружении неизвестных аргументов или при передаче аргументов, не соответствующихtype, настроенным вoptions. По умолчанию:true. -
allowPositionals<boolean> Принимает ли эта команда позиционные аргументы. По умолчанию:false, еслиstrictимеет значениеtrue, в противном случае —true. -
allowNegative<boolean> Еслиtrue, позволяет явно задавать для логических параметров значениеfalse, добавляя перед именем параметра--no-. По умолчанию:false. -
tokens<boolean> Возвращать разобранные токены. Это полезно для расширения встроенного поведения: от добавления дополнительных проверок до повторной обработки токенов различными способами. По умолчанию:false.
-
-
Возвращает: <Object> Разобранные аргументы командной строки:
-
values<Object> Сопоставление разобранных имен параметров с их значениями типа <string> или <boolean>. -
positionals<string[]> Позиционные аргументы. -
tokens<Object[]> | <undefined> См. раздел Токены parseArgs. Возвращается только в том случае, еслиconfigвключаетtokens: true.
-
Предоставляет API более высокого уровня для разбора аргументов командной строки, чем непосредственная работа с process.argv. Принимает спецификацию ожидаемых аргументов и возвращает структурированный объект с разобранными параметрами и позиционными аргументами.
Модули JavaScript
import { parseArgs } from 'node:util';
const args = ['-f', '--bar', 'b'];
const options = {
foo: {
type: 'boolean',
short: 'f',
},
bar: {
type: 'string',
},
};
const {
values,
positionals,
} = parseArgs({ args, options });
console.log(values, positionals);
// Prints: [Object: null prototype] { foo: true, bar: 'b' } []CommonJS
const { parseArgs } = require('node:util');
const args = ['-f', '--bar', 'b'];
const options = {
foo: {
type: 'boolean',
short: 'f',
},
bar: {
type: 'string',
},
};
const {
values,
positionals,
} = parseArgs({ args, options });
console.log(values, positionals);
// Prints: [Object: null prototype] { foo: true, bar: 'b' } []
parseArgs tokens
Подробная информация о разборе доступна для добавления пользовательского поведения. Для этого укажите tokens: true в конфигурации. Возвращаемые токены содержат свойства, описывающие:
- все токены
- токены параметров
-
name<string> Длинное имя параметра. -
rawName<string> Как параметр использован в аргументах, например-fиз--foo. -
value<string> | <undefined> Значение параметра, указанное в аргументах. Для логических параметров имеет значение undefined. -
inlineValue<boolean> | <undefined> Было ли значение параметра указано непосредственно, например--foo=bar.
-
- позиционные токены
-
value<string> Значение позиционного аргумента в аргументах (то естьargs[index]).
-
- токен-терминатор параметров
Возвращаемые токены расположены в том порядке, в котором они встречаются во входных аргументах. Для каждого параметра, встречающегося в аргументах несколько раз, создается отдельный токен. Группы коротких параметров, например -xy, преобразуются в отдельный токен для каждого параметра. Таким образом, -xxx создает три токена.
Например, чтобы добавить поддержку параметра с отрицанием, такого как --no-color (который поддерживается allowNegative, если параметр имеет тип boolean), можно повторно обработать возвращенные токены и изменить значение, сохраненное для параметра с отрицанием.
Модули JavaScript
import { parseArgs } from 'node:util';
const options = {
'color': { type: 'boolean' },
'no-color': { type: 'boolean' },
'logfile': { type: 'string' },
'no-logfile': { type: 'boolean' },
};
const { values, tokens } = parseArgs({ options, tokens: true });
// Reprocess the option tokens and overwrite the returned values.
tokens
.filter((token) => token.kind === 'option')
.forEach((token) => {
if (token.name.startsWith('no-')) {
// Store foo:false for --no-foo
const positiveName = token.name.slice(3);
values[positiveName] = false;
delete values[token.name];
} else {
// Resave value so last one wins if both --foo and --no-foo.
values[token.name] = token.value ?? true;
}
});
const color = values.color;
const logfile = values.logfile ?? 'default.log';
console.log({ logfile, color });CommonJS
const { parseArgs } = require('node:util');
const options = {
'color': { type: 'boolean' },
'no-color': { type: 'boolean' },
'logfile': { type: 'string' },
'no-logfile': { type: 'boolean' },
};
const { values, tokens } = parseArgs({ options, tokens: true });
// Reprocess the option tokens and overwrite the returned values.
tokens
.filter((token) => token.kind === 'option')
.forEach((token) => {
if (token.name.startsWith('no-')) {
// Store foo:false for --no-foo
const positiveName = token.name.slice(3);
values[positiveName] = false;
delete values[token.name];
} else {
// Resave value so last one wins if both --foo and --no-foo.
values[token.name] = token.value ?? true;
}
});
const color = values.color;
const logfile = values.logfile ?? 'default.log';
console.log({ logfile, color });Пример использования параметров с отрицанием и ситуации, когда параметр используется разными способами и побеждает последнее значение.
$ node negate.js
{ logfile: 'default.log', color: undefined }
$ node negate.js --no-logfile --no-color
{ logfile: false, color: false }
$ node negate.js --logfile=test.log --color
{ logfile: 'test.log', color: true }
$ node negate.js --no-logfile --logfile=test.log --color --no-color
{ logfile: 'test.log', color: false } copy
util.parseEnv(content)
-
content<string>
Необработанное содержимое файла .env.
- Возвращает: <Object>
Для примера файла .env:
CommonJS
const { parseEnv } = require('node:util');
parseEnv('HELLO=world\nHELLO=oh my\n');
// Returns: { HELLO: 'oh my' }Модули JavaScript
import { parseEnv } from 'node:util';
parseEnv('HELLO=world\nHELLO=oh my\n');
// Returns: { HELLO: 'oh my' }
util.promisify(original)
-
original<Function> - Возвращает: <Function>
Принимает функцию, использующую общепринятый стиль обратного вызова с ошибкой в первом аргументе, то есть принимающую обратный вызов (err, value) => ... в качестве последнего аргумента, и возвращает ее версию, возвращающую промисы.
Модули JavaScript
import { promisify } from 'node:util';
import { stat } from 'node:fs';
const promisifiedStat = promisify(stat);
promisifiedStat('.').then((stats) => {
// Do something with `stats`
}).catch((error) => {
// Handle the error.
});CommonJS
const { promisify } = require('node:util');
const { stat } = require('node:fs');
const promisifiedStat = promisify(stat);
promisifiedStat('.').then((stats) => {
// Do something with `stats`
}).catch((error) => {
// Handle the error.
});Или, что эквивалентно, используя async function:
Модули JavaScript
import { promisify } from 'node:util';
import { stat } from 'node:fs';
const promisifiedStat = promisify(stat);
async function callStat() {
const stats = await promisifiedStat('.');
console.log(`This directory is owned by ${stats.uid}`);
}
callStat();CommonJS
const { promisify } = require('node:util');
const { stat } = require('node:fs');
const promisifiedStat = promisify(stat);
async function callStat() {
const stats = await promisifiedStat('.');
console.log(`This directory is owned by ${stats.uid}`);
}
callStat();Если присутствует свойство original[util.promisify.custom], promisify вернет его значение. См. раздел Пользовательские функции с поддержкой промисов.
promisify() предполагает, что во всех случаях original является функцией, принимающей обратный вызов в качестве последнего аргумента. Если original не является функцией, promisify() вызовет ошибку. Если original является функцией, но ее последний аргумент не является обратным вызовом с ошибкой в первом аргументе, ей все равно будет передан такой обратный вызов в качестве последнего аргумента.
Использование promisify() для методов классов или других методов, использующих this, может привести к неожиданным результатам, если не обработать этот случай отдельно:
Модули JavaScript
import { promisify } from 'node:util';
class Foo {
constructor() {
this.a = 42;
}
bar(callback) {
callback(null, this.a);
}
}
const foo = new Foo();
const naiveBar = promisify(foo.bar);
// TypeError: Cannot read properties of undefined (reading 'a')
// naiveBar().then(a => console.log(a));
naiveBar.call(foo).then((a) => console.log(a)); // '42'
const bindBar = naiveBar.bind(foo);
bindBar().then((a) => console.log(a)); // '42'CommonJS
const { promisify } = require('node:util');
class Foo {
constructor() {
this.a = 42;
}
bar(callback) {
callback(null, this.a);
}
}
const foo = new Foo();
const naiveBar = promisify(foo.bar);
// TypeError: Cannot read properties of undefined (reading 'a')
// naiveBar().then(a => console.log(a));
naiveBar.call(foo).then((a) => console.log(a)); // '42'
const bindBar = naiveBar.bind(foo);
bindBar().then((a) => console.log(a)); // '42'Пользовательские функции с поддержкой промисов
С помощью символа util.promisify.custom можно переопределить значение, возвращаемое util.promisify():
Модули JavaScript
import { promisify } from 'node:util';
function doSomething(foo, callback) {
// ...
}
doSomething[promisify.custom] = (foo) => {
return getPromiseSomehow();
};
const promisified = promisify(doSomething);
console.log(promisified === doSomething[promisify.custom]);
// prints 'true'CommonJS
const { promisify } = require('node:util');
function doSomething(foo, callback) {
// ...
}
doSomething[promisify.custom] = (foo) => {
return getPromiseSomehow();
};
const promisified = promisify(doSomething);
console.log(promisified === doSomething[promisify.custom]);
// prints 'true'Это может быть полезно, если исходная функция не соответствует стандартному формату, при котором обратный вызов с ошибкой в первом аргументе передается последним аргументом.
Например, для функции, принимающей (foo, onSuccessCallback, onErrorCallback):
doSomething[util.promisify.custom] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
}; copy Если promisify.custom определено, но не является функцией, promisify() вызовет ошибку.
util.promisify.custom
- Тип: <symbol>, который можно использовать для объявления пользовательских вариантов функций с поддержкой промисов. См. раздел Пользовательские функции с поддержкой промисов.
Помимо доступа через util.promisify.custom, этот символ зарегистрирован глобально и доступен в любой среде как Symbol.for('nodejs.util.promisify.custom').
Например, для функции, принимающей (foo, onSuccessCallback, onErrorCallback):
const kCustomPromisifiedSymbol = Symbol.for('nodejs.util.promisify.custom');
doSomething[kCustomPromisifiedSymbol] = (foo) => {
return new Promise((resolve, reject) => {
doSomething(foo, resolve, reject);
});
}; copy
util.stripVTControlCharacters(str)
Возвращает str без кодов ANSI escape.
console.log(util.stripVTControlCharacters('\u001B[4mvalue\u001B[0m'));
// Prints "value" copy
util.styleText(format, text[, options])
-
format<string> | <Array> Формат текста или массив форматов текста, определенных вutil.inspect.colors. -
text<string> Текст для форматирования. -
options<Object>
Эта функция возвращает форматированный текст, учитывая переданный format для вывода в терминал. Она учитывает возможности терминала и действует в соответствии с настройками переменных среды NO_COLOR, NODE_DISABLE_COLORS и FORCE_COLOR.
Модули JavaScript
import { styleText } from 'node:util';
import { stderr } from 'node:process';
const successMessage = styleText('green', 'Success!');
console.log(successMessage);
const errorMessage = styleText(
'red',
'Error! Error!',
// Validate if process.stderr has TTY
{ stream: stderr },
);
console.error(errorMessage);CommonJS
const { styleText } = require('node:util');
const { stderr } = require('node:process');
const successMessage = styleText('green', 'Success!');
console.log(successMessage);
const errorMessage = styleText(
'red',
'Error! Error!',
// Validate if process.stderr has TTY
{ stream: stderr },
);
console.error(errorMessage);util.inspect.colors также предоставляет такие форматы текста, как italic и underline, которые можно комбинировать:
console.log( util.styleText(['underline', 'italic'], 'My italic underlined message'), ); copy
Если передан массив форматов, они применяются слева направо, поэтому последующий стиль может переопределить предыдущий.
console.log( util.styleText(['red', 'green'], 'text'), // green ); copy
Специальное значение формата none не добавляет к тексту никаких дополнительных стилей.
Полный список форматов приведен в разделе модификаторы.
Класс: util.TextDecoder
Реализация API TextDecoder стандарта кодирования WHATWG.
const decoder = new TextDecoder(); const u8arr = new Uint8Array([72, 101, 108, 108, 111]); console.log(decoder.decode(u8arr)); // Hello copy
Поддерживаемые кодировки WHATWG
В соответствии с стандартом кодирования WHATWG, кодировки, поддерживаемые API TextDecoder, перечислены в таблицах ниже. Для каждой кодировки можно использовать один или несколько псевдонимов.
Разные конфигурации сборки Node.js поддерживают разные наборы кодировок. (см. Интернационализация)
Кодировки, поддерживаемые по умолчанию (с полными данными ICU)
| Кодировка | Псевдонимы |
|---|---|
'ibm866' |
'866', 'cp866', 'csibm866'
|
'iso-8859-2' |
'csisolatin2', 'iso-ir-101', 'iso8859-2', 'iso88592', 'iso_8859-2', 'iso_8859-2:1987', 'l2', 'latin2'
|
'iso-8859-3' |
'csisolatin3', 'iso-ir-109', 'iso8859-3', 'iso88593', 'iso_8859-3', 'iso_8859-3:1988', 'l3', 'latin3'
|
'iso-8859-4' |
'csisolatin4', 'iso-ir-110', 'iso8859-4', 'iso88594', 'iso_8859-4', 'iso_8859-4:1988', 'l4', 'latin4'
|
'iso-8859-5' |
'csisolatincyrillic', 'cyrillic', 'iso-ir-144', 'iso8859-5', 'iso88595', 'iso_8859-5', 'iso_8859-5:1988'
|
'iso-8859-6' |
'arabic', 'asmo-708', 'csiso88596e', 'csiso88596i', 'csisolatinarabic', 'ecma-114', 'iso-8859-6-e', 'iso-8859-6-i', 'iso-ir-127', 'iso8859-6', 'iso88596', 'iso_8859-6', 'iso_8859-6:1987'
|
'iso-8859-7' |
'csisolatingreek', 'ecma-118', 'elot_928', 'greek', 'greek8', 'iso-ir-126', 'iso8859-7', 'iso88597', 'iso_8859-7', 'iso_8859-7:1987', 'sun_eu_greek'
|
'iso-8859-8' |
'csiso88598e', 'csisolatinhebrew', 'hebrew', 'iso-8859-8-e', 'iso-ir-138', 'iso8859-8', 'iso88598', 'iso_8859-8', 'iso_8859-8:1988', 'visual'
|
'iso-8859-8-i' |
'csiso88598i', 'logical'
|
'iso-8859-10' |
'csisolatin6', 'iso-ir-157', 'iso8859-10', 'iso885910', 'l6', 'latin6'
|
'iso-8859-13' |
'iso8859-13', 'iso885913'
|
'iso-8859-14' |
'iso8859-14', 'iso885914'
|
'iso-8859-15' |
'csisolatin9', 'iso8859-15', 'iso885915', 'iso_8859-15', 'l9'
|
'koi8-r' |
'cskoi8r', 'koi', 'koi8', 'koi8_r'
|
'koi8-u' |
'koi8-ru' |
'macintosh' |
'csmacintosh', 'mac', 'x-mac-roman'
|
'windows-874' |
'dos-874', 'iso-8859-11', 'iso8859-11', 'iso885911', 'tis-620'
|
'windows-1250' |
'cp1250', 'x-cp1250'
|
'windows-1251' |
'cp1251', 'x-cp1251'
|
'windows-1252' |
'ansi_x3.4-1968', 'ascii', 'cp1252', 'cp819', 'csisolatin1', 'ibm819', 'iso-8859-1', 'iso-ir-100', 'iso8859-1', 'iso88591', 'iso_8859-1', 'iso_8859-1:1987', 'l1', 'latin1', 'us-ascii', 'x-cp1252'
|
'windows-1253' |
'cp1253', 'x-cp1253'
|
'windows-1254' |
'cp1254', 'csisolatin5', 'iso-8859-9', 'iso-ir-148', 'iso8859-9', 'iso88599', 'iso_8859-9', 'iso_8859-9:1989', 'l5', 'latin5', 'x-cp1254'
|
'windows-1255' |
'cp1255', 'x-cp1255'
|
'windows-1256' |
'cp1256', 'x-cp1256'
|
'windows-1257' |
'cp1257', 'x-cp1257'
|
'windows-1258' |
'cp1258', 'x-cp1258'
|
'x-mac-cyrillic' |
'x-mac-ukrainian' |
'gbk' |
'chinese', 'csgb2312', 'csiso58gb231280', 'gb2312', 'gb_2312', 'gb_2312-80', 'iso-ir-58', 'x-gbk'
|
'gb18030' |
|
'big5' |
'big5-hkscs', 'cn-big5', 'csbig5', 'x-x-big5'
|
'euc-jp' |
'cseucpkdfmtjapanese', 'x-euc-jp'
|
'iso-2022-jp' |
'csiso2022jp' |
'shift_jis' |
'csshiftjis', 'ms932', 'ms_kanji', 'shift-jis', 'sjis', 'windows-31j', 'x-sjis'
|
'euc-kr' |
'cseuckr', 'csksc56011987', 'iso-ir-149', 'korean', 'ks_c_5601-1987', 'ks_c_5601-1989', 'ksc5601', 'ksc_5601', 'windows-949'
|
Кодировки, поддерживаемые при сборке Node.js с параметром small-icu
| Кодировка | Псевдонимы |
|---|---|
'utf-8' |
'unicode-1-1-utf-8', 'utf8'
|
'utf-16le' |
'utf-16' |
'utf-16be' |
Кодировки, поддерживаемые при отключённом ICU
| Кодировка | Псевдонимы |
|---|---|
'utf-8' |
'unicode-1-1-utf-8', 'utf8'
|
'utf-16le' |
'utf-16' |
Кодировка 'iso-8859-16', указанная в стандарте кодирования WHATWG, не поддерживается.
new TextDecoder([encoding[, options]])
-
encoding<string> Определяетencoding, поддерживаемую этим экземпляромTextDecoder. По умолчанию:'utf-8'. -
options<Object>-
fatal<boolean>true, если ошибки декодирования должны считаться фатальными. Этот параметр не поддерживается при отключённом ICU (см. Интернационализация). По умолчанию:false. -
ignoreBOM<boolean> Еслиtrue,TextDecoderвключит маркер порядка байтов в результат декодирования. Еслиfalse, маркер порядка байтов будет удалён из выходных данных. Этот параметр используется только в том случае, еслиencodingравно'utf-8','utf-16be'или'utf-16le'. По умолчанию:false.
-
Создаёт новый экземпляр TextDecoder. encoding может указывать одну из поддерживаемых кодировок или её псевдоним.
Класс TextDecoder также доступен в глобальном объекте.
textDecoder.decode([input[, options]])
-
input<ArrayBuffer> | <DataView> | <TypedArray> ЭкземплярArrayBuffer,DataViewилиTypedArray, содержащий закодированные данные. -
options<Object>-
stream<boolean>true, если ожидаются дополнительные фрагменты данных. По умолчанию:false.
-
- Возвращает: <string>
Декодирует input и возвращает строку. Если options.stream равно true, все неполные последовательности байтов в конце input буферизуются внутри и выдаются при следующем вызове textDecoder.decode().
Если textDecoder.fatal равно true, возникающие ошибки декодирования приводят к выбросу TypeError.
textDecoder.fatal
- Тип: <boolean>
Значение будет true, если ошибки декодирования приводят к выбросу TypeError.
textDecoder.ignoreBOM
- Тип: <boolean>
Значение будет true, если результат декодирования будет включать маркер порядка байтов.
Класс: util.TextEncoder
Реализация API TextEncoder стандарта кодирования WHATWG. Все экземпляры TextEncoder поддерживают только кодировку UTF-8.
const encoder = new TextEncoder();
const uint8array = encoder.encode('this is some data'); copy Класс TextEncoder также доступен в глобальном объекте.
textEncoder.encode([input])
-
input<string> Текст для кодирования. По умолчанию: пустая строка. - Возвращает: <Uint8Array>
Кодирует строку input в UTF-8 и возвращает Uint8Array, содержащий закодированные байты.
textEncoder.encodeInto(src, dest)
-
src<string> Текст для кодирования. -
dest<Uint8Array> Массив для хранения результата кодирования. - Возвращает: <Object>
Кодирует строку src в UTF-8 и помещает результат в Uint8Array dest, возвращая объект, содержащий количество прочитанных кодовых единиц Unicode и записанных байтов UTF-8.
const encoder = new TextEncoder();
const src = 'this is some data';
const dest = new Uint8Array(10);
const { read, written } = encoder.encodeInto(src, dest); copy
textEncoder.encoding
- Тип: <string>
Кодировка, поддерживаемая экземпляром TextEncoder. Всегда имеет значение 'utf-8'.
util.toUSVString(string)
-
string<string>
Возвращает string, заменяя все суррогатные кодовые точки (или, что эквивалентно, все непарные суррогатные кодовые единицы) символом Unicode «символ замены» U+FFFD.
util.transferableAbortController()
Создаёт и возвращает экземпляр <AbortController>, чей <AbortSignal> помечен как переносимый и может использоваться с structuredClone() или postMessage().
util.transferableAbortSignal(signal)
-
signal<AbortSignal> - Возвращает: <AbortSignal>
Помечает указанный <AbortSignal> как переносимый, чтобы его можно было использовать с structuredClone() и postMessage().
const signal = transferableAbortSignal(AbortSignal.timeout(100)); const channel = new MessageChannel(); channel.port2.postMessage(signal, [signal]); copy
util.aborted(signal, resource)
-
signal<AbortSignal> -
resource<Object> Любой объект, отличный от null, связанный с прерываемой операцией и слабо удерживаемый в памяти. Еслиresourceбудет удалён сборщиком мусора до прерыванияsignal, промис останется ожидающим, что позволит Node.js перестать отслеживать его. Это помогает предотвратить утечки памяти при длительных или неотменяемых операциях. - Возвращает: <Promise>
Ожидает событие прерывания для указанного signal и возвращает промис, который выполняется при прерывании signal. Если указан resource, он слабо ссылается на объект, связанный с операцией, поэтому, если resource будет удалён сборщиком мусора до прерывания signal, возвращённый промис останется ожидающим. Это предотвращает утечки памяти при длительных или неотменяемых операциях.
CommonJS
const { aborted } = require('node:util');
// Obtain an object with an abortable signal, like a custom resource or operation.
const dependent = obtainSomethingAbortable();
// Pass `dependent` as the resource, indicating the promise should only resolve
// if `dependent` is still in memory when the signal is aborted.
aborted(dependent.signal, dependent).then(() => {
// This code runs when `dependent` is aborted.
console.log('Dependent resource was aborted.');
});
// Simulate an event that triggers the abort.
dependent.on('event', () => {
dependent.abort(); // This will cause the `aborted` promise to resolve.
});Модули JavaScript
import { aborted } from 'node:util';
// Obtain an object with an abortable signal, like a custom resource or operation.
const dependent = obtainSomethingAbortable();
// Pass `dependent` as the resource, indicating the promise should only resolve
// if `dependent` is still in memory when the signal is aborted.
aborted(dependent.signal, dependent).then(() => {
// This code runs when `dependent` is aborted.
console.log('Dependent resource was aborted.');
});
// Simulate an event that triggers the abort.
dependent.on('event', () => {
dependent.abort(); // This will cause the `aborted` promise to resolve.
});
util.types
util.types предоставляет проверки типов для различных видов встроенных объектов. В отличие от instanceof или Object.prototype.toString.call(value), эти проверки не анализируют свойства объекта, доступные из JavaScript (например, его прототип), и обычно требуют накладных расходов на вызов C++.
Результат, как правило, не дает никаких гарантий относительно типов свойств или поведения, доступных для значения в JavaScript. Эти проверки полезны прежде всего разработчикам аддонов, которые предпочитают выполнять проверку типов в JavaScript.
API доступен через require('node:util').types или require('node:util/types').
util.types.isAnyArrayBuffer(value)
Возвращает true, если значение является экземпляром встроенного объекта <ArrayBuffer> или <SharedArrayBuffer>.
См. также util.types.isArrayBuffer() и util.types.isSharedArrayBuffer().
util.types.isAnyArrayBuffer(new ArrayBuffer()); // Returns true util.types.isAnyArrayBuffer(new SharedArrayBuffer()); // Returns true copy
util.types.isArrayBufferView(value)
Возвращает true, если значение является экземпляром одного из представлений <ArrayBuffer>, например типизированного массива или <DataView>. Эквивалентно ArrayBuffer.isView().
util.types.isArrayBufferView(new Int8Array()); // true
util.types.isArrayBufferView(Buffer.from('hello world')); // true
util.types.isArrayBufferView(new DataView(new ArrayBuffer(16))); // true
util.types.isArrayBufferView(new ArrayBuffer()); // false copy
util.types.isArgumentsObject(value)
Возвращает true, если значение является объектом arguments.
function foo() {
util.types.isArgumentsObject(arguments); // Returns true
} copy
util.types.isArrayBuffer(value)
Возвращает true, если значение является экземпляром встроенного объекта <ArrayBuffer>. Сюда не входят экземпляры <SharedArrayBuffer>. Обычно желательно проверять оба типа; для этого см. util.types.isAnyArrayBuffer().
util.types.isArrayBuffer(new ArrayBuffer()); // Returns true util.types.isArrayBuffer(new SharedArrayBuffer()); // Returns false copy
util.types.isAsyncFunction(value)
Возвращает true, если значение является асинхронной функцией. Функция сообщает только о том, что видит движок JavaScript; в частности, возвращаемое значение может не соответствовать исходному коду, если использовался инструмент транспиляции.
util.types.isAsyncFunction(function foo() {}); // Returns false
util.types.isAsyncFunction(async function foo() {}); // Returns true copy
util.types.isBigInt64Array(value)
Возвращает true, если значение является экземпляром BigInt64Array.
util.types.isBigInt64Array(new BigInt64Array()); // Returns true util.types.isBigInt64Array(new BigUint64Array()); // Returns false copy
util.types.isBigIntObject(value)
Возвращает true, если значение является объектом BigInt, например созданным с помощью Object(BigInt(123)).
util.types.isBigIntObject(Object(BigInt(123))); // Returns true util.types.isBigIntObject(BigInt(123)); // Returns false util.types.isBigIntObject(123); // Returns false copy
util.types.isBigUint64Array(value)
Возвращает true, если значение является экземпляром BigUint64Array.
util.types.isBigUint64Array(new BigInt64Array()); // Returns false util.types.isBigUint64Array(new BigUint64Array()); // Returns true copy
util.types.isBooleanObject(value)
Возвращает true, если значение является логическим объектом, например созданным с помощью new Boolean().
util.types.isBooleanObject(false); // Returns false util.types.isBooleanObject(true); // Returns false util.types.isBooleanObject(new Boolean(false)); // Returns true util.types.isBooleanObject(new Boolean(true)); // Returns true util.types.isBooleanObject(Boolean(false)); // Returns false util.types.isBooleanObject(Boolean(true)); // Returns false copy
util.types.isBoxedPrimitive(value)
Возвращает true, если значение является любым примитивным объектом-оберткой, например созданным с помощью new Boolean(), new String() или Object(Symbol()).
Например:
util.types.isBoxedPrimitive(false); // Returns false
util.types.isBoxedPrimitive(new Boolean(false)); // Returns true
util.types.isBoxedPrimitive(Symbol('foo')); // Returns false
util.types.isBoxedPrimitive(Object(Symbol('foo'))); // Returns true
util.types.isBoxedPrimitive(Object(BigInt(5))); // Returns true copy
util.types.isCryptoKey(value)
Возвращает true, если value является <CryptoKey>, в противном случае — false.
util.types.isDataView(value)
Возвращает true, если значение является экземпляром встроенного объекта <DataView>.
const ab = new ArrayBuffer(20); util.types.isDataView(new DataView(ab)); // Returns true util.types.isDataView(new Float64Array()); // Returns false copy
См. также ArrayBuffer.isView().
util.types.isDate(value)
Возвращает true, если значение является экземпляром встроенного объекта <Date>.
util.types.isDate(new Date()); // Returns true copy
util.types.isExternal(value)
Возвращает true, если значение является нативным значением External.
Нативное значение External — это особый тип объекта, содержащий необработанный указатель C++ (void*) для доступа из нативного кода и не имеющий других свойств. Такие объекты создаются либо внутренними механизмами Node.js, либо нативными аддонами. В JavaScript это замороженные объекты с прототипом null.
#include <js_native_api.h>
#include <stdlib.h>
napi_value result;
static napi_value MyNapi(napi_env env, napi_callback_info info) {
int* raw = (int*) malloc(1024);
napi_status status = napi_create_external(env, (void*) raw, NULL, NULL, &result);
if (status != napi_ok) {
napi_throw_error(env, NULL, "napi_create_external failed");
return NULL;
}
return result;
}
...
DECLARE_NAPI_PROPERTY("myNapi", MyNapi)
... copy Модули JavaScript
import native from 'napi_addon.node';
import { types } from 'node:util';
const data = native.myNapi();
types.isExternal(data); // returns true
types.isExternal(0); // returns false
types.isExternal(new String('foo')); // returns falseCommonJS
const native = require('napi_addon.node');
const { types } = require('node:util');
const data = native.myNapi();
types.isExternal(data); // returns true
types.isExternal(0); // returns false
types.isExternal(new String('foo')); // returns falseДополнительные сведения о napi_create_external см. в разделе napi_create_external().
util.types.isFloat16Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Float16Array>.
util.types.isFloat16Array(new ArrayBuffer()); // Returns false util.types.isFloat16Array(new Float16Array()); // Returns true util.types.isFloat16Array(new Float32Array()); // Returns false copy
util.types.isFloat32Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Float32Array>.
util.types.isFloat32Array(new ArrayBuffer()); // Returns false util.types.isFloat32Array(new Float32Array()); // Returns true util.types.isFloat32Array(new Float64Array()); // Returns false copy
util.types.isFloat64Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Float64Array>.
util.types.isFloat64Array(new ArrayBuffer()); // Returns false util.types.isFloat64Array(new Uint8Array()); // Returns false util.types.isFloat64Array(new Float64Array()); // Returns true copy
util.types.isGeneratorFunction(value)
Возвращает true, если значение является функцией-генератором. Функция сообщает только о том, что видит движок JavaScript; в частности, возвращаемое значение может не соответствовать исходному коду, если использовался инструмент транспиляции.
util.types.isGeneratorFunction(function foo() {}); // Returns false
util.types.isGeneratorFunction(function* foo() {}); // Returns true copy
util.types.isGeneratorObject(value)
Возвращает true, если значение является объектом-генератором, возвращенным встроенной функцией-генератором. Функция сообщает только о том, что видит движок JavaScript; в частности, возвращаемое значение может не соответствовать исходному коду, если использовался инструмент транспиляции.
function* foo() {}
const generator = foo();
util.types.isGeneratorObject(generator); // Returns true copy
util.types.isInt8Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Int8Array>.
util.types.isInt8Array(new ArrayBuffer()); // Returns false util.types.isInt8Array(new Int8Array()); // Returns true util.types.isInt8Array(new Float64Array()); // Returns false copy
util.types.isInt16Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Int16Array>.
util.types.isInt16Array(new ArrayBuffer()); // Returns false util.types.isInt16Array(new Int16Array()); // Returns true util.types.isInt16Array(new Float64Array()); // Returns false copy
util.types.isInt32Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Int32Array>.
util.types.isInt32Array(new ArrayBuffer()); // Returns false util.types.isInt32Array(new Int32Array()); // Returns true util.types.isInt32Array(new Float64Array()); // Returns false copy
util.types.isKeyObject(value)
Возвращает true, если value является <KeyObject>, в противном случае — false.
util.types.isMap(value)
Возвращает true, если значение является экземпляром встроенного объекта <Map>.
util.types.isMap(new Map()); // Returns true copy
util.types.isMapIterator(value)
Возвращает true, если значение является итератором, возвращенным для экземпляра встроенного объекта <Map>.
const map = new Map(); util.types.isMapIterator(map.keys()); // Returns true util.types.isMapIterator(map.values()); // Returns true util.types.isMapIterator(map.entries()); // Returns true util.types.isMapIterator(map[Symbol.iterator]()); // Returns true copy
util.types.isModuleNamespaceObject(value)
Возвращает true, если значение является экземпляром объекта пространства имен модуля.
import * as ns from './a.js'; util.types.isModuleNamespaceObject(ns); // Returns true copy
util.types.isNativeError(value)
Error.isError.Примечание: Начиная с Node.js 24, Error.isError() в настоящее время работает медленнее, чем util.types.isNativeError(). Если производительность критически важна, сравните их в своей среде.
Возвращает true, если значение было возвращено конструктором встроенного типа Error.
console.log(util.types.isNativeError(new Error())); // true console.log(util.types.isNativeError(new TypeError())); // true console.log(util.types.isNativeError(new RangeError())); // true copy
Подклассы нативных типов ошибок также являются нативными ошибками:
class MyError extends Error {}
console.log(util.types.isNativeError(new MyError())); // true copy То, что значение instanceof классом нативной ошибки, не эквивалентно тому, что isNativeError() возвращает true для этого значения. isNativeError() возвращает true для ошибок из другой области, тогда как instanceof Error возвращает false для этих ошибок:
Модули JavaScript
import { createContext, runInContext } from 'node:vm';
import { types } from 'node:util';
const context = createContext({});
const myError = runInContext('new Error()', context);
console.log(types.isNativeError(myError)); // true
console.log(myError instanceof Error); // falseCommonJS
const { createContext, runInContext } = require('node:vm');
const { types } = require('node:util');
const context = createContext({});
const myError = runInContext('new Error()', context);
console.log(types.isNativeError(myError)); // true
console.log(myError instanceof Error); // falseИ наоборот, isNativeError() возвращает false для всех объектов, которые не были возвращены конструктором нативной ошибки. Сюда входят значения, которые instanceof являются нативными ошибками:
const myError = { __proto__: Error.prototype };
console.log(util.types.isNativeError(myError)); // false
console.log(myError instanceof Error); // true copy
util.types.isNumberObject(value)
Возвращает true, если значение является числовым объектом, например созданным с помощью new Number().
util.types.isNumberObject(0); // Returns false util.types.isNumberObject(new Number(0)); // Returns true copy
util.types.isPromise(value)
Возвращает true, если значение является встроенным объектом <Promise>.
util.types.isPromise(Promise.resolve(42)); // Returns true copy
util.types.isProxy(value)
Возвращает true, если значение является экземпляром <Proxy>.
const target = {};
const proxy = new Proxy(target, {});
util.types.isProxy(target); // Returns false
util.types.isProxy(proxy); // Returns true copy
util.types.isRegExp(value)
Возвращает true, если значение является объектом регулярного выражения.
util.types.isRegExp(/abc/); // Returns true
util.types.isRegExp(new RegExp('abc')); // Returns true copy
util.types.isSet(value)
Возвращает true, если значение является экземпляром встроенного объекта <Set>.
util.types.isSet(new Set()); // Returns true copy
util.types.isSetIterator(value)
Возвращает true, если значение является итератором, возвращенным для экземпляра встроенного объекта <Set>.
const set = new Set(); util.types.isSetIterator(set.keys()); // Returns true util.types.isSetIterator(set.values()); // Returns true util.types.isSetIterator(set.entries()); // Returns true util.types.isSetIterator(set[Symbol.iterator]()); // Returns true copy
util.types.isSharedArrayBuffer(value)
Возвращает true, если значение является экземпляром встроенного объекта <SharedArrayBuffer>. Сюда не входят экземпляры <ArrayBuffer>. Обычно желательно проверять оба типа; для этого см. util.types.isAnyArrayBuffer().
util.types.isSharedArrayBuffer(new ArrayBuffer()); // Returns false util.types.isSharedArrayBuffer(new SharedArrayBuffer()); // Returns true copy
util.types.isStringObject(value)
Возвращает true, если значение является строковым объектом, например созданным с помощью new String().
util.types.isStringObject('foo'); // Returns false
util.types.isStringObject(new String('foo')); // Returns true copy
util.types.isSymbolObject(value)
Возвращает true, если значение является символьным объектом, созданным вызовом Object() для примитивного значения Symbol.
const symbol = Symbol('foo');
util.types.isSymbolObject(symbol); // Returns false
util.types.isSymbolObject(Object(symbol)); // Returns true copy
util.types.isTypedArray(value)
Возвращает true, если значение является экземпляром встроенного объекта <TypedArray>.
util.types.isTypedArray(new ArrayBuffer()); // Returns false util.types.isTypedArray(new Uint8Array()); // Returns true util.types.isTypedArray(new Float64Array()); // Returns true copy
См. также ArrayBuffer.isView().
util.types.isUint8Array(value)
Возвращает true, если значение является экземпляром встроенного объекта <Uint8Array>.
util.types.isUint8Array(new ArrayBuffer()); // Returns false util.types.isUint8Array(new Uint8Array()); // Returns true util.types.isUint8Array(new Float64Array()); // Returns false copy
util.types.isUint8ClampedArray(value)
Возвращает true, если значение является экземпляром встроенного объекта <Uint8ClampedArray>.
util.types.isUint8ClampedArray(new ArrayBuffer()); // Returns false util.types.isUint8ClampedArray(new Uint8ClampedArray()); // Returns true util.types.isUint8ClampedArray(new Float64Array()); // Returns false copy
util.types.isUint16Array(value)
Возвращает true, если значение является встроенным экземпляром <Uint16Array>.
util.types.isUint16Array(new ArrayBuffer()); // Returns false util.types.isUint16Array(new Uint16Array()); // Returns true util.types.isUint16Array(new Float64Array()); // Returns false copy
util.types.isUint32Array(value)
Возвращает true, если значение является встроенным экземпляром <Uint32Array>.
util.types.isUint32Array(new ArrayBuffer()); // Returns false util.types.isUint32Array(new Uint32Array()); // Returns true util.types.isUint32Array(new Float64Array()); // Returns false copy
util.types.isWeakMap(value)
Возвращает true, если значение является встроенным экземпляром <WeakMap>.
util.types.isWeakMap(new WeakMap()); // Returns true copy
Устаревшие API
Следующие API устарели и больше не должны использоваться. Существующие приложения и модули следует обновить, чтобы найти альтернативные подходы.
util._extend(target, source)
Object.assign().Метод util._extend() никогда не предназначался для использования вне внутренних модулей Node.js. Тем не менее сообщество обнаружило и использовало его.
Метод устарел, и его не следует использовать в новом коде. JavaScript предоставляет очень похожую встроенную функциональность с помощью Object.assign().
Доступна автоматическая миграция (исходный код):
npx codemod@latest @nodejs/util-extend-to-object-assign copy
util.isArray(object)
Array.isArray().Псевдоним для Array.isArray().
Возвращает true, если заданный object является Array. В противном случае возвращает false.
const util = require('node:util');
util.isArray([]);
// Returns: true
util.isArray(new Array());
// Returns: true
util.isArray({});
// Returns: false copy Доступна автоматическая миграция (исходный код):
npx codemod@latest @nodejs/util-is copy
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v24.x/docs/api/util.html