transformar
Os fluxos de transformação são legíveis e graváveis e, portanto, são realmente bons fluxos 'médios'. Por esse motivo, às vezes são chamados de through
fluxos. Eles são semelhantes a um fluxo duplex dessa maneira, exceto que eles fornecem uma interface agradável para manipular os dados em vez de apenas enviá-los. O objetivo de um fluxo de transformação é manipular os dados conforme eles são canalizados através do fluxo. Você pode fazer algumas chamadas assíncronas, por exemplo, ou derivar alguns campos, remapear algumas coisas, etc.
Para saber como criar um fluxo de transformação, veja aqui e aqui . Tudo o que tem a fazer é :
- inclua o módulo de fluxo
- instanciar (ou herdar) a classe Transform
- implementar um
_transform
método que leva a (chunk, encoding, callback)
.
O pedaço é seus dados. Na maioria das vezes, você não precisará se preocupar com a codificação se estiver trabalhando objectMode = true
. O retorno de chamada é chamado quando você terminar de processar o bloco. Esse pedaço é então empurrado para o próximo fluxo.
Se você quer um bom módulo auxiliar que permita realizar o fluxo realmente muito facilmente, sugiro o through2 .
Para tratamento de erros, continue lendo.
tubo
Em uma cadeia de tubulação, o tratamento de erros é de fato não trivial. De acordo com este segmento, o .pipe () não foi criado para encaminhar erros. Então, algo como ...
var a = createStream();
a.pipe(b).pipe(c).on('error', function(e){handleError(e)});
... só ouviria erros no fluxo c
. Se um evento de erro fosse emitido a
, isso não seria transmitido e, de fato, seria lançado. Para fazer isso corretamente:
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)});
Agora, embora a segunda maneira seja mais detalhada, você pode pelo menos manter o contexto de onde seus erros ocorrem. Isso geralmente é uma coisa boa.
Uma biblioteca que eu acho útil, se você tem um caso em que deseja capturar apenas os erros no destino e não se importa muito com o local em que isso aconteceu, é o fluxo de eventos .
fim
Quando um evento de erro é acionado, o evento final não será acionado (explicitamente). A emissão de um evento de erro encerrará o fluxo.
domínios
Na minha experiência, os domínios funcionam muito bem na maioria das vezes. Se você tiver um evento de erro não tratado (ou seja, emitindo um erro em um fluxo sem um ouvinte), o servidor poderá travar. Agora, como o artigo acima indica, você pode agrupar o fluxo em um domínio que deve capturar corretamente todos os erros.
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);
});
A beleza dos domínios é que eles preservarão os rastreamentos de pilha. Embora o fluxo de eventos faça um bom trabalho nisso também.
Para ler mais, confira o manual do stream . Bastante detalhado, mas super útil e oferece ótimos links para vários módulos úteis.
Promise
estruturas de torná-lo muito mais simples