[英]request: how to pipe file and keep the response object
我使用 npm 请求。 我想下载一个文件并将其写入文件系统,然后使用返回的响应对象进行进一步处理。
我知道我可以直接管道响应对象,但之后我没有更多的响应对象进行进一步处理
var result = await request(builtReq).pipe(fs.createWriteStream(myFilePath));
所以我现在的实现是这样的:
var result = await request(builtReq);
但是我无法通过管道传输结果对象,因为可流式传输状态为 false。
所以我需要一种方法来保持请求的返回并将文件写入文件系统。 我可以重置流状态或以某种方式保留响应 obj 并同时写入文件吗? 我试图通过手动实现写入文件。 fs.writeFile() 在我收到响应 obj 后,但我遇到了文件编码问题,因为我可以接收任何东西,但最终我得到了损坏的文件。
有人知道如何解决这个问题吗?
您是否需要响应对象(其中包含状态代码和标头),还是在内存中需要响应主体?
如果您只想要响应对象,但仍希望将主体写入文件,则可以像这样获取响应:
var response;
await request(builtReq).on('response', r => {
console.log('Response received: ' + r);
response = r;
}).pipe(fs.createWriteStream(myFilePath));
console.log('Finished saving file, response is still ' + response);
如果需要处理实际主体,则有两种选择:
保持现有代码不变,然后在完成后立即从磁盘上读取文件(因为您正在使用await
,这将是下一行),然后在内存中对其进行处理。
将输入流传递到多个位置-一个传递到文件写入流,另一个传递到内存缓冲区(使用标准的on('data')
处理函数)。 流完成后,文件被保存,您可以处理内存中的缓冲区。 有关几个不同的示例,请参见相关问题node.js传递相同的可读流 。
记住承诺只能解决一次。
所以要解决你的问题:
var promise = request(builtReq)
// now do what ever number of operations you need
result.pipe(fs.createWriteStream(myFilePath));
promise.then(r=>console.log('i will still get data here :)');
promise.then(r=>console.log('and here !');
promise.then(r=>console.log('and here !!');
var result = await promise; // and here to !!
承诺一旦解决, .then
将始终得到结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.