transformar
Las secuencias de transformación son legibles y se pueden escribir y, por lo tanto, son muy buenas secuencias 'intermedias'. Por esta razón, a veces se les conoce como through
secuencias. Son similares a una transmisión dúplex de esta manera, excepto que proporcionan una interfaz agradable para manipular los datos en lugar de simplemente enviarlos. El propósito de una secuencia de transformación es manipular los datos a medida que se canalizan a través de la secuencia. Es posible que desee hacer algunas llamadas asíncronas, por ejemplo, o derivar un par de campos, reasignar algunas cosas, etc.
Para saber cómo crear una secuencia de transformación, vea aquí y aquí . Todo lo que tienes que hacer es :
- incluir el módulo de transmisión
- instanciar (o heredar de) la clase Transform
- implementar un
_transform
método que tome a (chunk, encoding, callback)
.
El fragmento son tus datos. La mayoría de las veces no tendrá que preocuparse por la codificación si está trabajando en objectMode = true
. Se llama a la devolución de llamada cuando haya terminado de procesar el fragmento. Este fragmento se pasa a la siguiente secuencia.
Si quieres un buen módulo de ayuda que le permitirá hacer a través de la corriente muy, muy fácilmente, sugiero through2 .
Para el manejo de errores, sigue leyendo.
tubo
En una cadena de tuberías, los errores de manejo no son triviales. De acuerdo con este hilo, .pipe () no está diseñado para reenviar errores. Entonces algo como ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... solo escucharía los errores en la transmisión c
. Si se emitiera un evento de error a
, no se transmitiría y, de hecho, se lanzaría. Para hacer esto correctamente:
var a = createStream();
a.on('error', function(e){handleError(e)})
.pipe(b)
.on('error', function(e){handleError(e)})
.pipe(c)
.on('error', function(e){handleError(e)});
Ahora, aunque la segunda forma es más detallada, al menos puede mantener el contexto de dónde ocurren sus errores. Esto suele ser algo bueno.
Sin embargo, una biblioteca que encuentro útil si tiene un caso en el que solo desea capturar los errores en el destino y no le importa mucho dónde sucedió es el flujo de eventos .
final
Cuando se dispara un evento de error, el evento final no se disparará (explícitamente). La emisión de un evento de error finalizará la transmisión.
dominios
En mi experiencia, los dominios funcionan muy bien la mayor parte del tiempo. Si tiene un evento de error no controlado (es decir, emitiendo un error en una secuencia sin un oyente), el servidor puede bloquearse. Ahora, como señala el artículo anterior, puede envolver la transmisión en un dominio que debería detectar correctamente todos los errores.
var d = domain.create();
d.on('error', handleAllErrors);
d.run(function() {
fs.createReadStream(tarball)
.pipe(gzip.Gunzip())
.pipe(tar.Extract({ path: targetPath }))
.on('close', cb);
});
La belleza de los dominios es que preservarán los rastros de la pila. Aunque event-stream también hace un buen trabajo en esto.
Para leer más, consulte el manual de transmisión . Bastante en profundidad, pero súper útil y ofrece excelentes enlaces a muchos módulos útiles.
Promise
frameworks lo hacen mucho más simple