TL;DR - 你最好使用pipeline
什么是管道?
From the docs:一种模块方法,用于在流之间进行管道转发错误并正确清理,并在管道完成时提供回调。
使用管道的动机是什么?
❌
我们来看看下面的代码:
const { createReadStream } = require('fs');
const { createServer } = require('http');
const server = createServer(
(req, res) => {
createReadStream(__filename).pipe(res);
}
);
server.listen(3000);
这里有什么问题?
如果响应将退出或客户端关闭连接 - 那么读取流未关闭或销毁,这会导致内存泄漏。
✅因此,如果您使用pipeline,它将关闭所有其他流并确保没有内存泄漏。
const { createReadStream } = require('fs');
const { createServer } = require('http');
const { pipeline } = require('stream');
const server = createServer(
(req, res) => {
pipeline(
createReadStream(__filename),
res,
err => {
if (err)
console.error('Pipeline failed.', err);
else
console.log('Pipeline succeeded.');
}
);
}
);
server.listen(3000);