首页 > 解决方案 > Node.js 中转换流的透明度

问题描述

我编写了一些适用于可读和可写流的代码。现在我想通过使用一些转换流向这些流添加转换。我写的代码,特别是错误传播,还能工作吗?背压应该由pipe/正确处理pipeline,但我不确定错误传播。

更准确地说,假设我有这种形式的功能:

async function f(r, w) {
    assert(r.isPaused());
    ...
    r.on("data", dataListener);
    const rCleanup = finished(r, err => ...);
    w.on("drain", drainListener);
    const wCleanup = finished(w, err => ...);
    ...
    ... r.pause() ... r.resume() ... r.pause() ...
    ...
    ... remove all listeners + cleanup
    ...
    return new Promise(...);
}

该功能与“常规”可读和可写流完美配合。

现在让t1t2成为两个变换流。如果两个转换流都正确实现,下面的代码会起作用吗?

const r_t1 = r.pipe(t1);
r_t1.pause();
const t2_w = t2.pipe(w);
try {
    await f(r_t1, t2_w);
} catch(err) {
    ...
}

现在可能会出现 4 个点的错误:r、w、t1、t2。他们会被正确抓住吗?我应该pipeline改用吗?不过,我不需要回调,而且我担心这会干扰finished.

那么资源泄漏呢?我读到pipe在这方面存在一些问题,但是当我不再需要它们时,我会关闭/销毁我使用的每个流。

标签: node.jsnode-streams

解决方案


推荐阅读