Módulo util de Node.js
En Node.js,utilel módulo es un módulo principal que proporciona una serie de funciones de utilidad práctica. Estas funciones se utilizan principalmente para ayudar a los desarrolladores a completar tareas de programación comunes, como la comprobación de tipos, la implementación de herencia, la salida de depuración, etc.utilEl diseño original del módulo es compensar las deficiencias de las funciones nativas de JavaScript y proporcionar más conveniencia a los desarrolladores.
Para usarutilel módulo, solo necesitas incluirlo en tu código:
const util = require('util');
Funciones principales del módulo util
1. Herramientas de comprobación de tipos
utilEl módulo proporciona algunas funciones para la comprobación de tipos, que son más precisas y útiles que eltypeofoperador nativo de JavaScript.
util.types.isArrayBuffer(value)
Comprueba si el valor dado es una instancia de ArrayBuffer.
Ejemplo
console.log(util.types.isArrayBuffer(arrBuffer)); // true
console.log(util.types.isArrayBuffer([])); // false
util.types.isDate(value)
Comprueba si el valor dado es una instancia de Date.
Ejemplo
console.log(util.types.isDate('2023-01-01')); // false
2. Funciones de utilidad práctica
util.format(format[, ...args])
Similar a la funciónprintfprintf de C, utilizada para formatear cadenas.
Ejemplo
const age = 30;
console.log(util.format('My name is %s and I am %d years old', name, age));
// Salida: My name is John and I am 30 years old
util.inspect(object[, options])
Devuelve la representación en cadena de un objeto, utilizada principalmente para depuración. Se pueden configurar opciones como profundidad, color, etc.
Ejemplo
name: 'Alice',
details: {
age: 25,
hobbies: ['reading', 'coding']
}
};
console.log(util.inspect(obj, { depth: 2, colors: true }));
3. Conversión de estilo callback
util.promisify(original)
Convierte funciones que siguen el estilo callback de Node.js en funciones que devuelven una Promise.
Ejemplo
const readFile = util.promisify(fs.readFile);
async function readConfig() {
try {
const data = await readFile('config.json', 'utf8');
console.log(data);
} catch (err) {
console.error('Error reading file:', err);
}
}
readConfig();
util.callbackify(original)
ypromisifyPor el contrario, convierte funciones que devuelven una Promise en funciones de estilo callback.
Ejemplo
return 'Hello World';
}
const callbackFunc = util.callbackify(asyncFunc);
callbackFunc((err, result) => {
if (err) throw err;
console.log(result); // Hello World
});
4. Herramientas de herencia
util.inherits(constructor, superConstructor)
Implementa la herencia prototípica (estilo ES5). Nota: en ES6, se recomienda usarclassyextendslas palabras clave.
Ejemplo
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a noise.');
};
function Dog(name) {
Animal.call(this, name);
}
util.inherits(Dog, Animal);
Dog.prototype.speak = function() {
console.log(this.name + ' barks.');
};
const d = new Dog('Rex');
d.speak(); // Rex barks.
Escenarios de aplicación práctica del módulo util
1. Depuración de objetos complejos
Cuando necesites imprimir la estructura de un objeto complejo,util.inspectque el simpleconsole.loges más poderoso:
Ejemplo
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. Modernización de código antiguo
Convierte código antiguo de estilo callback a estilo Promise:
Ejemplo
function oldStyleFunc(param, callback) {
// Algunas operaciones asíncronas
setTimeout(() => {
callback(null, `Result for ${param}`);
}, 100);
}
// Convertido a estilo Promise
const newStyleFunc = util.promisify(oldStyleFunc);
async function useNewStyle() {
const result = await newStyleFunc('test');
console.log(result); // Result for test
}
useNewStyle();
3. Inspección personalizada de objetos
Se puede personalizar elinspectmétodo del objeto para cambiarutil.inspectla salida de:
Ejemplo
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
Precauciones
- Consideraciones de rendimiento:
util.inspectPuede tener un impacto en el rendimiento para objetos grandes, por lo que debe usarse con precaución en entornos de producción. - Estabilidad de la API: Aunque
utilel módulo es un módulo principal, algunas API pueden seguir marcadas como experimentales. - Alternativas modernas: Algunas funciones (como
util.inherits) tienen mejores alternativas en JavaScript moderno (comoclasssintaxis). - Manejo de errores: Al usar
promisify, asegúrate de manejar correctamente los errores y evitar los rechazos de Promise no capturados.
Métodos y propiedades
| Método/Propiedad | Descripción | Versión de introducción |
|---|---|---|
| util.callbackify(original) | Convierte una función async que devuelve una Promise en una función de estilo callback. | 8.2.0 |
| util.debuglog(section) | Crea una función que solo registra mensajes cuando la variable de entorno NODE_DEBUG contiene la sección especificada. | 0.11.3 |
| util.deprecate(fn, msg[, code]) | Envuelve una función para que emita una advertencia de obsolescencia cuando se llame. | 0.8.0 |
| util.format(format[, ...args]) | Utiliza el primer argumento como una cadena de formato similar a printf para formatear cadenas. | 0.5.3 |
| util.formatWithOptions(inspectOptions, format[, ...args]) | Similar a util.format(), pero acepta opciones de inspect. | 10.0.0 |
| util.getSystemErrorName(err) | Devuelve el nombre del error del sistema representado por el código de error err. | 9.7.0 |
| util.inherits(constructor, superConstructor) | Hereda los métodos del prototipo de un constructor a otro constructor (obsoleto, se recomienda usar class y extends de ES6). | 0.3.0 |
| util.inspect(object[, options]) | Devuelve la representación en cadena de un objeto, para depuración. | 0.3.0 |
| util.isDeepStrictEqual(val1, val2) | Comprueba si dos valores son estrictamente iguales en profundidad. | 9.0.0 |
| util.promisify(original) | Convierte una función de estilo callback en una función que devuelve una Promise. | 8.0.0 |
| util.stripVTControlCharacters(str) | Elimina los códigos de escape ANSI de una cadena. | 16.11.0 |
| util.TextDecoder | Alias de la implementación TextDecoder estándar de WHATWG. | 8.3.0 |
| util.TextEncoder | Alias de la implementación TextEncoder estándar de WHATWG. | 8.3.0 |
| util.types | Proporciona un objeto de utilidades para la comprobación de varios tipos de Node.js. | 10.0.0 |
| util.aborted(err, signal) | Comprueba si el error fue causado por una señal de aborto. | 18.18.0 |
| util.parseArgs([config]) | Función de utilidad para analizar argumentos de línea de comandos. | 18.3.0 |
Métodos proporcionados por util.types
| Método | Descripción |
|---|---|
| util.types.isAnyArrayBuffer(value) | Comprueba si es una instancia de AnyArrayBuffer. |
| util.types.isArrayBuffer(value) | Comprueba si es una instancia de ArrayBuffer. |
| util.types.isAsyncFunction(value) | Comprueba si es una función asíncrona. |
| util.types.isBigInt64Array(value) | Comprueba si es una instancia de BigInt64Array. |
| util.types.isBigUint64Array(value) | Comprueba si es una instancia de BigUint64Array. |
| util.types.isBooleanObject(value) | Comprueba si es un objeto Boolean. |
| util.types.isBoxedPrimitive(value) | Comprueba si es un tipo primitivo empaquetado (boxed). |
| util.types.isCryptoKey(value) | Comprueba si es una instancia de CryptoKey. |
| util.types.isDataView(value) | Comprueba si es una instancia de DataView. |
| util.types.isDate(value) | Comprueba si es una instancia de Date. |
| util.types.isExternal(value) | Comprueba si es un valor nativo externo. |
| util.types.isFloat32Array(value) | Comprueba si es una instancia de Float32Array. |
| util.types.isFloat64Array(value) | Comprueba si es una instancia de Float64Array. |
| util.types.isGeneratorFunction(value) | Comprueba si es una función generadora. |
| util.types.isGeneratorObject(value) | Comprueba si es un objeto generador. |
| util.types.isInt8Array(value) | Comprueba si es una instancia de Int8Array. |
| util.types.isInt16Array(value) | Comprueba si es una instancia de Int16Array. |
| util.types.isInt32Array(value) | Comprueba si es una instancia de Int32Array. |
| util.types.isMap(value) | Comprueba si es una instancia de Map. |
| util.types.isMapIterator(value) | Comprueba si es un iterador de Map. |
| util.types.isModuleNamespaceObject(value) | Comprueba si es un objeto de espacio de nombres de módulo. |
| util.types.isNativeError(value) | Comprueba si es un objeto de error nativo. |
| util.types.isNumberObject(value) | Comprueba si es un objeto Number. |
| util.types.isPromise(value) | Comprueba si es una Promise. |
| util.types.isProxy(value) | Comprueba si es un objeto Proxy. |
| util.types.isRegExp(value) | Comprueba si es un objeto RegExp. |
| util.types.isSet(value) | Comprueba si es una instancia de Set. |
| util.types.isSetIterator(value) | Comprueba si es un iterador de Set. |
| util.types.isSharedArrayBuffer(value) | Comprueba si es una instancia de SharedArrayBuffer. |
| util.types.isStringObject(value) | Comprueba si es un objeto String. |
| util.types.isSymbolObject(value) | Comprueba si es un objeto Symbol. |
| util.types.isTypedArray(value) | Comprueba si es una instancia de TypedArray. |
| util.types.isUint8Array(value) | Comprueba si es una instancia de Uint8Array. |
| util.types.isUint8ClampedArray(value) | Comprueba si es una instancia de Uint8ClampedArray. |
| util.types.isUint16Array(value) | Comprueba si es una instancia de Uint16Array. |
| util.types.isUint32Array(value) | Comprueba si es una instancia de Uint32Array. |
| util.types.isWeakMap(value) | Comprueba si es una instancia de WeakMap. |
| util.types.isWeakSet(value) | Comprueba si es una instancia de WeakSet. |
Resumen
El módulo util de Node.jsutilproporciona muchas funciones de utilidad práctica, que pueden ayudar a los desarrolladores a escribir código de manera más eficiente. Desde la comprobación de tipos hasta el control de flujo asíncrono, pasando por la salida de depuración,utilel módulo cubre varios requisitos comunes en el desarrollo. Aunque JavaScript moderno ya ha proporcionado muchas soluciones nativas,utilel módulo sigue siendo muy útil en muchos escenarios, especialmente cuando se trabaja con código heredado o se necesitan funciones utilitarias específicas.
Dominarutilel uso del módulo puede hacer que tu desarrollo en Node.js sea más fluido, especialmente en la depuración y la conversión de código.
Módulo integrado de Node.js