【发布时间】:2017-09-19 07:56:56
【问题描述】:
我正在尝试从远程服务器获取 PDF 文件并将它们通过管道传回请求客户端,如下所示:
var writeStream = fs.createWriteStream(filename);
writeStream.on('close', function () {
console.log("Closed write stream");
});
writeStream.on('open', function () {
console.log('Open event for writestream');
});
writeStream.on('pipe', function () {
console.log('pipe event for writestream');
var rd = fs.createReadStream(filename);
rd.on('open', function () {
console.log('Open event for readstream');
});
rd.on('close', function () {
console.log("Closed read stream");
}).pipe(res);
});
request(pQuestURL)
.on('error', function (err) {
console.log(err);
res.json({ status: -1, message: 'Maps error, check your parameters' });
})
.pipe(writeStream);
但它给了我如下输出:
pipe event for writestream
Open event for writestream
Open event for readstream
Closed read stream
Closed write stream
我期待 readstream 仅在 writestream 完成后完成。 readstream 似乎立即关闭,因此我的客户收到一个空响应,而 writestream 仅在下载整个 pdf 后才完成。我的理解有漏洞吗?如何在不等待writestream 的finish 事件的情况下直接返回?
编辑:
实际上,我可以将可读流保存在一个变量中,然后通过管道将其传输到任意数量的可写流。我通过简化 as 来实现我的目标:
var mapRequest = request(pQuestURL);
mapRequest.on('error', function (err) {
console.log(err);
res.json({ status: -1, message: 'Maps error, check your parameters' });
});
mapRequest.pipe(writeStream);
mapRequest.pipe(res);
【问题讨论】:
-
为什么需要 writeStream?你不能只请求(pQuestURL).pipe(res); ???看起来您的 readStream 比 writeStream 更快,因为 writeStream 取决于下载速度...
-
你是对的。我可以将可读流保存在一个变量中,并将其通过管道传输到我想要的任意数量的可写文件中。现在编辑我的问题。谢谢
-
并且无需将文件存储在您的服务器上。只会浪费资源……
标签: javascript node.js