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

时间:2018-12-23 15:50:06

标签: node.js stream request fs

我使用npm请求。我想下载一个文件并将其写入文件系统,然后使用返回的响应对象进行进一步处理。

我知道我可以直接通过管道传递响应对象,但是之后我再也没有响应对象可以进行进一步处理

var result = await request(builtReq).pipe(fs.createWriteStream(myFilePath));

所以我目前的实现如下:

var result = await request(builtReq);

但是我无法通过管道传递结果对象,因为流式传输状态为false。

因此,我需要一种方法来保持请求的返回并将文件写入文件系统。我可以重置流状态还是以某种方式保留响应obj并同时写入文件? 我试图通过手动实现写入文件。收到响应obj后出现fs.writeFile(),但文件编码出现问题,因为我可以收到任何东西,结果文件损坏。

有人知道如何解决吗?

1 个答案:

答案 0 :(得分:0)

您是否需要 response 对象(其中包含状态代码和标头),还是您需要内存中的响应主体?

如果您只想要响应对象,但仍希望将正文写入文件,则可以像这样获取响应:

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 piping the same readable stream