【问题标题】:request: how to pipe file and keep the response object请求:如何通过管道传输文件并保留响应对象
【发布时间】:2019-05-23 02:51:27
【问题描述】:

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

我知道我可以直接通过管道传递响应对象,但之后我没有更多响应对象可供进一步处理

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

所以我现在的实现是这样的:

var result = await request(builtReq);

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

所以我需要一种方法来保持请求的返回并将文件写入文件系统。我可以重置流状态或以某种方式保留响应 obj 并同时写入文件吗? 我试图通过手动实现写入文件。 fs.writeFile() 在我收到响应 obj 后,但我遇到了文件编码问题,因为我可以接收任何内容,但我最终得到了损坏的文件。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: node.js stream request fs


    【解决方案1】:

    您想要 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

    【讨论】:

    • 这正是我需要的一个小问题。我从该 sendRequest 函数返回响应对象,并且 await 奇怪地不等待收到响应。所以我最终得到了一个未定义的回报。我不太明白他如何在触发响应事件之前解决等待和管道图像。在那之前我可以使用的另一个事件在哪里?哪里有一些带有事件列表的文档?我快到了这正是我需要的地方。
    • 啊,我没有在我的回答中包含这个 - 你正在使用“等待”(这需要请求返回一个承诺)但这不是一个基于承诺的库。 await 关键字在这里没有任何意义。您需要执行基本的异步方法,即在管道完成时添加事件处理程序。不过,在您的情况下,我建议您改用 github.com/request/request-promise - 它为您包装了带有承诺的库。如果您要在内存中处理响应,只需放弃流式传输,使用承诺,然后保存到磁盘。
    【解决方案2】:

    记住承诺只能解决一次。

    所以解决你的问题:

    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 将始终得到结果。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2013-04-25
      • 2016-03-06
      • 2011-01-03
      • 1970-01-01
      • 2016-06-14
      • 2019-05-15
      • 1970-01-01
      相关资源
      最近更新 更多