繁体   English   中英

请求:如何通过管道传输文件并保留响应对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM