Herramientas comunes de Node.js
utilEl módulo util es un módulo integrado de Node.js que contiene funciones de utilidad para soportar la depuración, el manejo de errores, el formateo y otras funciones en la programación JavaScript.
utilProporciona una colección de funciones comunes para compensar la escasez de funcionalidad del JavaScript principal.
utilLas funciones del módulo abarcan desde la inspección de objetos, la herencia, hasta el formateo de cadenas, entre otros aspectos.
Importar el módulo util
Primero, necesitas importar el módulo util:
const util = require('util');
Métodos comunes:
| Método | Descripción |
|---|---|
util.format(format, ...args) | Formato de cadenas, admite%s、%d、%jplaceholders. |
util.inspect(object[, options]) | Convierte un objeto en una cadena, para depuración. |
util.promisify(function) | Convierte funciones de estilo callback en funciones que devuelven una Promise. |
util.callbackify(fn) | Convierte funciones que devuelven Promise en funciones de estilo callback. |
util.inherits(constructor, superConstructor) | Hace que un constructor herede los métodos prototipo de otro constructor. |
util.deprecate(fn, message) | Marca una función como obsoleta; al llamarla se imprime un mensaje de advertencia. |
util.types | Contiene una colección de métodos de detección de tipos, por ejemploisAnyArrayBuffer、isBigInt64Array。 |
util.isDeepStrictEqual(val1, val2) | Determina si dos valores son profundamente iguales, similar a una comparación profunda. |
util.getSystemErrorName(err) | Devuelve el nombre del error del sistema según el código de error. |
util.inspect.custom | Un Symbol, que puede definir uninspectcomportamiento personalizado, para depuración. |
Métodos de detección de tipos bajo util.types
util.types es una colección de muchos métodos de detección de tipos que amplía typeof e instanceof de JavaScript.
| Método | Descripción |
|---|---|
util.types.isAnyArrayBuffer(value) | Comprueba si el valor esArrayBufferoSharedArrayBuffer。 |
util.types.isArrayBuffer(value) | Comprueba si el valor esArrayBuffer。 |
util.types.isAsyncFunction(value) | Comprueba si el valor es una función asíncrona. |
util.types.isBigInt64Array(value) | Comprueba si el valor esBigInt64Array。 |
util.types.isBigUint64Array(value) | Comprueba si el valor esBigUint64Array。 |
util.types.isBooleanObject(value) | Comprueba si el valor es un objeto booleano. |
util.types.isDataView(value) | Comprueba si el valor esDataView。 |
util.types.isDate(value) | Comprueba si el valor esDate。 |
util.types.isGeneratorFunction(value) | Comprueba si el valor es una función generadora. |
util.types.isMap(value) | Comprueba si el valor esMap。 |
util.types.isSet(value) | Comprueba si el valor esSet。 |
util.types.isRegExp(value) | Comprueba si el valor es una expresión regular. |
util.types.isSymbolObject(value) | Comprueba si el valor es un objeto símbolo. |
Ejemplo de aplicación
util.format() - Formato de cadenas
util.format() se utiliza para generar cadenas formateadas, admite placeholders como %s, %d y %j, que representan cadenas, números y JSON, respectivamente.
Ejemplo
const name = 'Alice';
const age = 25;
console.log(util.format('Name: %s, Age: %d', name, age)); // Salida: Name: Alice, Age: 25
util.promisify() - Convertir funciones de devolución de llamada en Promise
util.promisify() convierte funciones de estilo callback tradicional en funciones que devuelven una Promise, de modo que se pueden usar con async/await.
Ejemplo
const fs = require('fs');
// Convertir fs.readFile de estilo callback en una función que devuelve 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() - Convertir Promise en callback
util.callbackify() convierte funciones que devuelven Promise en funciones de estilo callback, para facilitar su uso en entornos de código que requieren callbacks.
util.callbackify(original)va aasyncFunción asíncrona (o una cuyo valor de retorno seaPromisefunción) se convierte en una función de estilo callback con prioridad de excepción, por ejemplo, tomando el(err, value) => ...callback como último parámetro.Promisese resuelve, entonces esnull), el segundo parámetro es el valor resuelto.
Ejemplo
async function fn() {
return 'hello world';
}
const callbackFunction = util.callbackify(fn);
callbackFunction((err, ret) => {
if (err) throw err;
console.log(ret);
});
El resultado del código anterior es:
hello world
La función de callback se ejecuta de forma asíncrona y tiene seguimiento de la pila de errores de excepción. Si la función de callback lanza una excepción, el proceso dispara una excepción 'uncaughtException'; si no se captura, el proceso saldrá.
null tiene un significado especial como parámetro en la función de callback. Si el primer parámetro de la función de callback es el motivo de rechazo de la Promise y tiene un valor de retorno, y ese valor puede convertirse al booleano false, dicho valor se encapsula en un objeto Error y se puede obtener mediante la propiedad 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 es una función async. Esta función devuelve una función de callback tradicional.
util.deprecate() - Marcar función como obsoleta
util.deprecate() se utiliza para marcar funciones no recomendadas; al llamarlas se muestra un mensaje de advertencia.
Ejemplo
const oldFunction = util.deprecate(() => {
console.log('This function is deprecated');
}, 'oldFunction is deprecated. Use newFunction instead.');
oldFunction(); // Al llamarla se muestra una advertencia
util.types - Detección de tipos de datos
util.types proporciona un conjunto de métodos para detectar tipos de datos específicos, ampliando las funciones de typeof e instanceof.
Ejemplo
console.log(util.types.isDate(new Date())); // true
console.log(util.types.isMap(new Map())); // true
util.inherits
util.inherits(constructor, superConstructor)es una función que implementa la herencia prototípica entre objetos.
La programación orientada a objetos de JavaScript se basa en prototipos, a diferencia de la común basada en clases. JavaScript no ofrece una característica a nivel de lenguaje para la herencia de objetos, sino que se implementa mediante la copia de prototipos.
Aquí solo presentamos el uso de util.inherits, el ejemplo es el siguiente:
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);
Definimos un objeto base Base y un Sub que hereda de Base. Base tiene tres propiedades definidas en el constructor y una función definida en el prototipo; la herencia se implementa mediante util.inherits. El resultado de la ejecución es el siguiente:
base
Hello base
{ name: 'base', base: 1991, sayHello: [Function] }
sub
{ name: 'sub' }
Nota:Sub solo hereda la función definida por Base en el prototipo, mientras que la propiedad base y la función sayHello creadas dentro del constructor no son heredadas por Sub.
Además, las propiedades definidas en el prototipo no se muestran como propiedades del objeto mediante console.log. Si quitamos el comentario de la línea objSub.sayHello();, veremos:
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)
Nota:Antes de la aparición de ES6, util.inherits era el método principal para implementar herencia en Node.js. Sin embargo, después de ES6 se recomienda usar la sintaxis class y extends, ya que el código de herencia resulta más legible.
util.inspect() - Imprimir estructura de objetos
util.inspect(object[, options]): convierte un objeto en una representación de cadena, facilitando la depuración.
util.inspect() convierte un objeto en una cadena, a menudo utilizado para depuración, para ver la estructura detallada y las propiedades de un objeto. Se puede especificar el parámetro options para controlar el formato de salida.
Ejemplo
const obj = { a: 1, b: 2, c: { d: 3 } };
console.log(util.inspect(obj, { showHidden: false, depth: null, colors: true }));
util.isArray(object)
Si el parámetro dado "object" es un array, devuelve true; de lo contrario, devuelve false.
var util = require('util');
util.isArray([])
// true
util.isArray(new Array)
// true
util.isArray({})
// false
util.isRegExp(object)
Si el parámetro dado "object" es una expresión regular, devuelve true; de lo contrario, devuelve false.
var util = require('util');
util.isRegExp(/some regexp/)
// true
util.isRegExp(new RegExp('another regexp'))
// true
util.isRegExp({})
// false
util.isDate(object)
Si el parámetro dado "object" es una fecha, devuelve true; de lo contrario, devuelve false.
var util = require('util');
util.isDate(new Date())
// true
util.isDate(Date())
// false (without 'new' returns a String)
util.isDate({})
// false
Para obtener más detalles, puedes visitarhttp://nodejs.org/api/util.htmlpara conocer el contenido detallado.
Otras extensiones