Модуль util в Node.js
В Node.jsutilМодуль — это основной модуль, который предоставляет ряд служебных функций. Эти функции в основном используются, чтобы помочь разработчикам выполнять распространённые задачи программирования, такие как проверка типов, реализация наследования, вывод отладочной информации и т. д.utilМодуль изначально был разработан, чтобы восполнить недостатки встроенных возможностей JavaScript и предоставить разработчикам больше удобства.
Чтобы использоватьutilмодуль, вам просто нужно импортировать его в вашем коде:
const util = require('util');
Основные возможности модуля util
1. Утилиты проверки типов
utilМодуль предоставляет некоторые функции для проверки типов, которые более точны и полезны, чем встроенные в JavaScripttypeofоператоры.
util.types.isArrayBuffer(value)
Проверяет, является ли заданное значение экземпляром ArrayBuffer.
Пример
console.log(util.types.isArrayBuffer(arrBuffer)); // true
console.log(util.types.isArrayBuffer([])); // false
util.types.isDate(value)
Проверяет, является ли заданное значение экземпляром Date.
Пример
console.log(util.types.isDate('2023-01-01')); // false
2. Вспомогательные функции
util.format(format[, ...args])
Аналогично функции printfprintfв языке C, используемой для форматирования строк.
Пример
const age = 30;
console.log(util.format('Меня зовут %s, и мне %d лет', name, age));
// Вывод: Меня зовут John, и мне 30 лет
util.inspect(object[, options])
Возвращает строковое представление объекта, в основном для отладки. Такие параметры, как depth и colors, можно настроить.
Пример
name: 'Alice',
details: {
age: 25,
hobbies: ['reading', 'coding']
}
};
console.log(util.inspect(obj, { depth: 2, colors: true }));
3. Преобразование в стиле callback
util.promisify(original)
Преобразует функции, использующие стиль callback в Node.js, в функции, возвращающие Promise.
Пример
const readFile = util.promisify(fs.readFile);
async function readConfig() {
try {
const data = await readFile('config.json', 'utf8');
console.log(data);
} catch (err) {
console.error('Ошибка чтения файла:', err);
}
}
readConfig();
util.callbackify(original)
иpromisifyИ наоборот, преобразует функции, возвращающие промисы, в функции в стиле обратного вызова.
Пример
return 'Hello World';
}
const callbackFunc = util.callbackify(asyncFunc);
callbackFunc((err, result) => {
if (err) throw err;
console.log(result); // Hello World
});
4. Утилиты наследования
util.inherits(constructor, superConstructor)
Реализует прототипное наследование (в стиле ES5). Примечание: в ES6 рекомендуется использоватьclassиextendsключевое слово.
Пример
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' издаёт звук.');
};
function Dog(name) {
Animal.call(this, name);
}
util.inherits(Dog, Animal);
Dog.prototype.speak = function() {
console.log(this.name + ' лает.');
};
const d = new Dog('Rex');
d.speak(); // Рекс лает.
Практические сценарии применения модуля util
1. Отладка сложных объектов
Когда нужно вывести структуру сложного объекта,util.inspectмощнее, чем простойconsole.logconsole.log:
Пример
date: new Date(),
regex: /test/g,
nested: {
array: [1, 2, 3],
fn: function() {}
}
};
console.log(util.inspect(complexObj, {
showHidden: true,
depth: null,
colors: true
}));
2. Модернизация старого кода
Преобразуйте старый код в стиле callback в стиль Promise:
Пример
function oldStyleFunc(param, callback) {
// Некоторые асинхронные операции
setTimeout(() => {
callback(null, `Result for ${param}`);
}, 100);
}
// Преобразовать в стиль Promise
const newStyleFunc = util.promisify(oldStyleFunc);
async function useNewStyle() {
const result = await newStyleFunc('test');
console.log(result); // Результат для test
}
useNewStyle();
3. Пользовательская инспекция объектов
Вы можете настроитьinspectметод для измененияutil.inspectвывод util.inspect:
Пример
constructor(value) {
this.value = value;
}
[util.inspect.custom](depth, options) {
return `CustomObject: ${this.value}`;
}
}
const obj = new CustomObject('test');
console.log(util.inspect(obj)); // CustomObject: test
Примечания
- Вопросы производительности:
util.inspectДля больших объектов может быть влияние на производительность; используйте с осторожностью в рабочих средах. - Стабильность API: Хотя
utilЭтот модуль является core-модулем, но некоторые API всё ещё могут быть помечены как экспериментальные возможности. - Современные альтернативы: Некоторые возможности (такие как
util.inherits) имеют лучшие альтернативы в современном JavaScript (например, следующийclassсинтаксис). - Обработка ошибок: При использовании
promisifyубедитесь, что правильно обрабатываете ошибки, чтобы избежать необработанных отклонений Promise.
Методы и свойства
| Метод/Свойство | Описание | Введено в версии |
|---|---|---|
| util.callbackify(original) | Преобразует асинхронную функцию, возвращающую Promise, в функцию в стиле callback. | 8.2.0 |
| util.debuglog(section) | Создает функцию, которая логирует сообщения только тогда, когда переменная среды NODE_DEBUG содержит указанный раздел. | 0.11.3 |
| util.deprecate(fn, msg[, code]) | Оборачивает функцию так, чтобы при вызове она выдавала предупреждение об устаревании. | 0.8.0 |
| util.format(format[, ...args]) | Форматирует строку, используя первый аргумент как строку формата, подобную printf. | 0.5.3 |
| util.formatWithOptions(inspectOptions, format[, ...args]) | Аналогично util.format(), но принимает параметры inspect. | 10.0.0 |
| util.getSystemErrorName(err) | Возвращает имя системной ошибки, представленное кодом ошибки err. | 9.7.0 |
| util.inherits(constructor, superConstructor) | Наследует методы прототипа одного конструктора другому конструктору (устарело; рекомендуется использовать ES6 class и extends). | 0.3.0 |
| util.inspect(object[, options]) | Возвращает строковое представление объекта, используемое для отладки. | 0.3.0 |
| util.isDeepStrictEqual(val1, val2) | Проверяет, являются ли два значения глубоко строго равными. | 9.0.0 |
| util.promisify(original) | Преобразует функцию в стиле обратного вызова в функцию, возвращающую Promise. | 8.0.0 |
| util.stripVTControlCharacters(str) | Удаляет управляющие последовательности ANSI из строки. | 16.11.0 |
| util.TextDecoder | Псевдоним для стандартной реализации TextDecoder WHATWG. | 8.3.0 |
| util.TextEncoder | Псевдоним для стандартной реализации TextEncoder из WHATWG. | 8.3.0 |
| util.types | Предоставляет вспомогательный объект для различных проверок типов Node.js. | 10.0.0 |
| util.aborted(err, signal) | Проверяет, вызвана ли ошибка сигналом прерывания. | 18.18.0 |
| util.parseArgs([config]) | Вспомогательная функция для разбора аргументов командной строки. | 18.3.0 |
Методы, предоставляемые util.types
| Метод | Описание |
|---|---|
| util.types.isAnyArrayBuffer(value) | Проверяет, является ли оно экземпляром AnyArrayBuffer. |
| 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.isBoxedPrimitive(value) | Проверяет, является ли значение упакованным примитивом. |
| util.types.isCryptoKey(value) | Проверяет, является ли значение экземпляром CryptoKey. |
| util.types.isDataView(value) | Проверяет, является ли это экземпляром DataView. |
| util.types.isDate(value) | Проверяет, является ли это экземпляром Date. |
| util.types.isExternal(value) | Проверяет, является ли это внешним нативным значением. |
| util.types.isFloat32Array(value) | Проверяет, является ли это экземпляром Float32Array. |
| util.types.isFloat64Array(value) | Проверяет, является ли это экземпляром Float64Array. |
| util.types.isGeneratorFunction(value) | Проверяет, является ли это функцией-генератором. |
| util.types.isGeneratorObject(value) | Проверяет, является ли это объектом-генератором. |
| util.types.isInt8Array(value) | Проверяет, является ли это экземпляром Int8Array. |
| util.types.isInt16Array(value) | Проверяет, является ли это экземпляром Int16Array. |
| util.types.isInt32Array(value) | Проверяет, является ли это экземпляром Int32Array. |
| util.types.isMap(value) | Проверяет, является ли это экземпляром Map. |
| util.types.isMapIterator(value) | Проверяет, является ли это итератором Map. |
| util.types.isModuleNamespaceObject(value) | Проверяет, является ли это объектом пространства имён модуля. |
| util.types.isNativeError(value) | Проверяет, является ли это встроенным объектом ошибки. |
| util.types.isNumberObject(value) | Проверяет, является ли это объектом Number. |
| util.types.isPromise(value) | Проверяет, является ли это Promise. |
| util.types.isProxy(value) | Проверяет, является ли это объектом Proxy. |
| util.types.isRegExp(value) | Проверяет, является ли это объектом RegExp. |
| util.types.isSet(value) | Проверяет, является ли это экземпляром Set. |
| util.types.isSetIterator(value) | Проверяет, является ли оно итератором Set. |
| util.types.isSharedArrayBuffer(value) | Проверяет, является ли оно экземпляром SharedArrayBuffer. |
| util.types.isStringObject(value) | Проверяет, является ли оно объектом String. |
| util.types.isSymbolObject(value) | Проверяет, является ли оно объектом Symbol. |
| util.types.isTypedArray(value) | Проверяет, является ли оно экземпляром TypedArray. |
| util.types.isUint8Array(value) | Проверяет, является ли оно экземпляром Uint8Array. |
| util.types.isUint8ClampedArray(value) | Проверяет, является ли значение экземпляром Uint8ClampedArray. |
| util.types.isUint16Array(value) | Проверяет, является ли значение экземпляром Uint16Array. |
| util.types.isUint32Array(value) | Проверяет, является ли значение экземпляром Uint32Array. |
| util.types.isWeakMap(value) | Проверяет, является ли значение экземпляром WeakMap. |
| util.types.isWeakSet(value) | Проверяет, является ли значение экземпляром WeakSet. |
Итог
Node.jsutilМодуль предоставляет множество практических служебных функций, которые помогают разработчикам писать код более эффективно. От проверки типов до управления асинхронными потоками и вывода отладочной информации,utilМодуль охватывает множество распространённых потребностей разработки. Хотя современный JavaScript уже предоставляет множество нативных решений,utilМодуль по-прежнему очень полезен во многих сценариях, особенно при работе с устаревшим кодом или когда требуются определённые служебные функции.
ОсвоениеutilИспользование модуля может сделать вашу разработку на Node.js более комфортной и эффективной, особенно при отладке и преобразовании кода.
Встроенные модули Node.js