Node.js流:是否可以将fs写流转换或包装为Transform流?

时间:2018-06-29 00:36:19

标签: node.js http stream

使用节点http服务器,我试图通过一些中间转换将请求读取流传输到响应写入流,其中之一是文件系统写入。

为简化起见,管道删除了不相关的代码,如下所示:

function handler (req, res) {
  req.pipe(jsonParse())
     .pipe(addTimeStamp())
     .pipe(jsonStringify())
     .pipe(saveToFs('saved.json'))
     .pipe(res);
}

自定义Transform流非常简单,但是我没有编写saveToFs的优雅方法。看起来像这样:

function saveToFs (filename) {
  const write$ = fs.createWriteStream(filename);
  write$.on('open', () => console.log('opened'));
  write$.on('close', () => console.log('closed'));

  const T = new Transform();
  T._transform = function (chunk, encoding, cb) {
    write$.write(chunk);
    cb(null, chunk);
  }
  return T;
}

这个想法只是将数据通过管道传递到写入流,然后再传递到响应流,但是fs.createWriteStream(<file.name>)只是可写流,因此使此方法变得困难。

现在此代码有两个问题,我可以看到:写入流从不触发关闭事件(内存泄漏?),我希望数据在返回数据到响应流之前先通过文件系统写入基本上组播到两个接收器。

任何建议,或指出我错过的基本知识,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您应该做的是将stream返回的.pipe保存在saveToFs之前,然后将其通过管道传输到文件和res

function handler(req, res) {
    const transformed = req.pipe(jsonParse())
        .pipe(addTimeStamp())
        .pipe(jsonStringify());

    transformed.pipe(fs.createWriteStream('saved.json'));
    transformed.pipe(res);
}

总结起来,您可以将相同的可读流(transformed)传输到多个可写流。

  

我希望数据通过文件系统写入   在将数据返回到响应流之前而不是本质上   多播到两个接收器。

管道输送到{ end: false }时使用res选项。

transformed.pipe(res, { end: false });

然后在写入文件或需要时调用res.end()