- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
对于 Node http 服务器,我试图通过一些中间转换将请求读取流传输到响应写入流,其中之一是文件系统写入。
管道看起来像这样,为简单起见删除了不相关的代码:
function handler (req, res) {
req.pipe(jsonParse())
.pipe(addTimeStamp())
.pipe(jsonStringify())
.pipe(saveToFs('saved.json'))
.pipe(res);
}
自定义转换流非常简单,但我没有优雅的写作方式 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>)
只是一个可写流,所以它使这种方法变得困难。
现在这段代码有两个我能看到的问题:写入流从不触发关闭事件(内存泄漏?),我希望数据在将数据返回到响应流之前通过文件系统写入本质上是多播到两个接收器。
如有任何建议或指出我遗漏的基本内容,我们将不胜感激。
最佳答案
你应该做的是在 saveToFs
之前保存由 .pipe
返回的 stream
,然后将其通过管道传输到文件和 res
.
function handler(req, res) {
const transformed = req.pipe(jsonParse())
.pipe(addTimeStamp())
.pipe(jsonStringify());
transformed.pipe(fs.createWriteStream('saved.json'));
transformed.pipe(res);
}
总而言之,您可以将同一个可读流(转换
)通过管道传输到多个可写流。
And I would like the data to pass through the file system write before returning data to the response stream instead of essentially multicasting to two sinks.
在管道传输到 res
时使用 { end: false }
选项。
transformed.pipe(res, { end: false });
然后在写入文件时或任何需要时调用 res.end()
。
关于Node.js 流 : Is there a way to convert or wrap a fs write stream to a Transform stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092808/
我是一名优秀的程序员,十分优秀!