Общие утилиты Node.js

utilМодуль — это встроенный модуль Node.js, содержащий служебные функции, которые поддерживают отладку, обработку ошибок, форматирование и другие возможности в программировании на JavaScript.

utilПредоставляет набор часто используемых функций, чтобы компенсировать чрезмерную упрощённость функциональности ядра JavaScript.

utilФункции модуля охватывают различные аспекты: от инспектирования объектов и наследования до форматирования строк.

Импорт модуля util

Сначала нужно импортировать модуль util:

const util = require('util');

Общие методы:

МетодОписание
util.format(format, ...args)Форматирование строк, поддерживает%s、%d、%jзаполнители.
util.inspect(object[, options])Преобразует объект в строку для отладки.
util.promisify(function)Преобразует функции в стиле обратного вызова в функции, возвращающие Promise.
util.callbackify(fn)Преобразует функции, возвращающие Promise, в функции в стиле callback.
util.inherits(constructor, superConstructor)Заставляет конструктор наследовать методы прототипа другого конструктора.
util.deprecate(fn, message)Помечает функцию как устаревшую и выводит предупреждающее сообщение при вызове.
util.typesКоллекция, содержащая несколько методов определения типов, таких какisAnyArrayBuffer、isBigInt64Array。
util.isDeepStrictEqual(val1, val2)Определяет, являются ли два значения глубоко равными, аналогично глубокому сравнению.
util.getSystemErrorName(err)Возвращает имя системной ошибки на основе кода ошибки.
util.inspect.customSymbol, который может определять пользовательскоеinspectповедение для отладки.

Методы определения типов в util.types

util.types — это коллекция множества методов определения типов, расширяющая возможности typeof и instanceof в JavaScript.

МетодОписание
util.types.isAnyArrayBuffer(value)Проверяет, является ли значениеArrayBufferилиSharedArrayBuffer。
util.types.isArrayBuffer(value)Проверяет, является ли значениеArrayBuffer。
util.types.isAsyncFunction(value)Проверяет, является ли значение асинхронной функцией.
util.types.isBigInt64Array(value)Проверяет, является ли значениеBigInt64Array。
util.types.isBigUint64Array(value)Проверяет, является ли значениеBigUint64Array。
util.types.isBooleanObject(value)Проверяет, является ли значение объектом Boolean.
util.types.isDataView(value)Проверяет, является ли значениеDataView。
util.types.isDate(value)Проверяет, является ли значениеDate。
util.types.isGeneratorFunction(value)Проверяет, является ли значение функцией-генератором.
util.types.isMap(value)Проверяет, является ли значениеMap。
util.types.isSet(value)Проверяет, является ли значениеSet。
util.types.isRegExp(value)Проверяет, является ли значение регулярным выражением.
util.types.isSymbolObject(value)Проверяет, является ли значение объектом Symbol.

Примеры использования

util.format() — форматирование строк

util.format() используется для создания форматированных строк и поддерживает такие заполнители, как %s, %d и %j, обозначающие соответственно строки, числа и JSON.

Пример

const util = require('util');
const name = 'Alice';
const age = 25;
console.log(util.format('Name: %s, Age: %d', name, age));  // Вывод: Name: Alice, Age: 25

util.promisify() — преобразование функций обратного вызова в Promise

util.promisify() преобразует традиционные функции в стиле обратного вызова в функции, возвращающие Promise, поэтому их можно использовать с async/await.

Пример

const util = require('util');
const fs = require('fs');

// Преобразовать fs.readFile в стиле обратного вызова в функцию, возвращающую Promise
const readFileAsync = util.promisify(fs.readFile);

(async () => {
  try {
    const data = await readFileAsync('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
})();

util.callbackify() - Преобразование Promise в колбэк

util.callbackify() преобразует функции, возвращающие Promise, в функции в стиле колбэков, что делает их удобными для использования в средах кода, которые требуют колбэков.

util.callbackify(original)будетasyncАсинхронная функция (или функция, возвращаемое значение которой являетсяPromiseфункция) преобразуется в функцию в стиле колбэков, следуя соглашению error-first, например, принимая(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);
});

Вывод вышеприведённого кода:

hello world

Функция обратного вызова выполняется асинхронно и имеет трассировку стека исключений. Если функция обратного вызова выбрасывает исключение, процесс вызовет исключение '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
});

original — это асинхронная функция. Эта функция возвращает традиционную функцию обратного вызова.

util.deprecate() - Пометить функцию как устаревшую

util.deprecate() используется для пометки функций, которые не рекомендуются к использованию, и при вызове будет отображаться предупреждающее сообщение.

Пример

const util = require('util');

const oldFunction = util.deprecate(() => {
  console.log('Эта функция устарела');
}, 'oldFunction устарела. Вместо неё используйте newFunction.');

oldFunction();  // При вызове отображается предупреждение

util.types — определение типов данных

util.types предоставляет набор методов для определения конкретных типов данных, расширяя возможности typeof и instanceof.

Пример

const util = require('util');
console.log(util.types.isDate(new Date()));  // true
console.log(util.types.isMap(new Map()));    // true

util.inherits

util.inherits(constructor, superConstructor)— это функция, которая реализует наследование прототипов между объектами.

Объектно-ориентированные возможности JavaScript основаны на прототипах, в отличие от распространённого подхода на основе классов. JavaScript не предоставляет языковых средств для наследования объектов, но реализует его через копирование прототипов.

Здесь мы лишь рассмотрим использование util.inherits, пример ниже:

var util = require('util'); 
function Base() { 
    this.name = 'base'; 
    this.base = 1991; 
    this.sayHello = function() { 
    console.log('Hello ' + this.name); 
    }; 
} 
Base.prototype.showName = function() { 
    console.log(this.name);
}; 
function Sub() { 
    this.name = 'sub'; 
} 
util.inherits(Sub, Base); 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub); 

Мы определяем базовый объект Base и Sub, который наследуется от Base. Base имеет три свойства, определённых внутри конструктора, и одну функцию, определённую в прототипе. Наследование реализуется через util.inherits. Результат выполнения выглядит так:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

Примечание:Sub наследует только функцию, определённую Base в прототипе, а свойство base и функция sayHello, созданные внутри конструктора, не наследуются Sub.

В то же время свойства, определённые в прототипе, не будут выводиться console.log как свойства объекта. Если мы уберём комментарий в строке objSub.sayHello();, мы увидим:

node.js:201 
throw e; // process.nextTick error, or 'error' event on first tick 
^ 
TypeError: Object #<Sub> has no method 'sayHello' 
at Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
at Module._compile (module.js:441:26) 
at Object..js (module.js:459:10) 
at Module.load (module.js:348:31) 
at Function._load (module.js:308:12) 
at Array.0 (module.js:479:10) 
at EventEmitter._tickCallback (node.js:192:40) 

Примечание:До ES6 util.inherits был основным способом реализации наследования в Node.js. Однако после ES6 рекомендуется использовать синтаксис class и extends, что делает код наследования более читаемым.

util.inspect() — вывод структуры объекта

util.inspect(object[, options]): Преобразует объект в строковое представление для удобной отладки.

util.inspect() преобразует объект в строковую форму, часто используется при отладке для просмотра подробной структуры и свойств объекта. Можно указать параметр options для управления форматом вывода.

Пример


const obj = { a: 1, b: 2, c: { d: 3 } };
console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));

util.isArray(object)

Возвращает true, если заданный параметр "object" является массивом, в противном случае возвращает false.

var util = require('util');

util.isArray([])
  // true
util.isArray(new Array)
  // true
util.isArray({})
  // false

util.isRegExp(object)

Возвращает true, если заданный параметр "object" является регулярным выражением, в противном случае возвращает false.

var util = require('util');

util.isRegExp(/some regexp/)
  // true
util.isRegExp(new RegExp('another regexp'))
  // true
util.isRegExp({})
  // false

util.isDate(object)

Возвращает true, если заданный параметр "object" является Date, в противном случае возвращает false.

var util = require('util');

util.isDate(new Date())
  // true
util.isDate(Date())
  // false (without 'new' returns a String)
util.isDate({})
  // false

Для получения дополнительных сведений посетитеhttp://nodejs.org/api/util.html, чтобы узнать больше.

Другие расширения