Общие утилиты 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.custom | Symbol, который может определять пользовательское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 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 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), а второй параметр — разрешённое значение.
Пример
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 oldFunction = util.deprecate(() => {
console.log('Эта функция устарела');
}, 'oldFunction устарела. Вместо неё используйте newFunction.');
oldFunction(); // При вызове отображается предупреждение
util.types — определение типов данных
util.types предоставляет набор методов для определения конкретных типов данных, расширяя возможности typeof и instanceof.
Пример
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, чтобы узнать больше.
Другие расширения