Модуль util в Node.js

Java FileВстроенные модули Node.js


В Node.jsutilМодуль — это основной модуль, который предоставляет ряд служебных функций. Эти функции в основном используются, чтобы помочь разработчикам выполнять распространённые задачи программирования, такие как проверка типов, реализация наследования, вывод отладочной информации и т. д.utilМодуль изначально был разработан, чтобы восполнить недостатки встроенных возможностей JavaScript и предоставить разработчикам больше удобства.

Чтобы использоватьutilмодуль, вам просто нужно импортировать его в вашем коде:

const util = require('util');

Основные возможности модуля util

1. Утилиты проверки типов

utilМодуль предоставляет некоторые функции для проверки типов, которые более точны и полезны, чем встроенные в JavaScripttypeofоператоры.

util.types.isArrayBuffer(value)

Проверяет, является ли заданное значение экземпляром ArrayBuffer.

Пример

const arrBuffer = new ArrayBuffer(8);
console.log(util.types.isArrayBuffer(arrBuffer)); // true
console.log(util.types.isArrayBuffer([])); // false

util.types.isDate(value)

Проверяет, является ли заданное значение экземпляром Date.

Пример

console.log(util.types.isDate(new Date())); // true
console.log(util.types.isDate('2023-01-01')); // false

2. Вспомогательные функции

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

Аналогично функции printfprintfв языке C, используемой для форматирования строк.

Пример

const name = 'John';
const age = 30;
console.log(util.format('Меня зовут %s, и мне %d лет', name, age));
// Вывод: Меня зовут John, и мне 30 лет

util.inspect(object[, options])

Возвращает строковое представление объекта, в основном для отладки. Такие параметры, как depth и colors, можно настроить.

Пример

const obj = {
  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 fs = require('fs');
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И наоборот, преобразует функции, возвращающие промисы, в функции в стиле обратного вызова.

Пример

async function asyncFunc() {
  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ключевое слово.

Пример

function Animal(name) {
  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:

Пример

const complexObj = {
  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:

Пример

// Старый код в стиле callback
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:

Пример

class CustomObject {
  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

Примечания

  1. Вопросы производительности:util.inspectДля больших объектов может быть влияние на производительность; используйте с осторожностью в рабочих средах.
  2. Стабильность API: ХотяutilЭтот модуль является core-модулем, но некоторые API всё ещё могут быть помечены как экспериментальные возможности.
  3. Современные альтернативы: Некоторые возможности (такие какutil.inherits) имеют лучшие альтернативы в современном JavaScript (например, следующийclassсинтаксис).
  4. Обработка ошибок: При использовании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 более комфортной и эффективной, особенно при отладке и преобразовании кода.

Java FileВстроенные модули Node.js