【问题标题】:Random error when piping twice http request管道两次http请求时出现随机错误
【发布时间】:2015-03-19 15:30:21
【问题描述】:

我有这个代码:

var file = fs.createWriteStream(_filename, _saveFile);
var request = http.request(options);
var decrypt = Crypto.createDecipheriv('aes-128-cbc', key, iv);

var _saveFile = function(response) {
  res.pipe(decrypt).pipe(file);
  res.on("end", function() {
    file.close();
  });
};

file.on("error", function(err) {
  console.log("Error while writing file", err);
});

它工作正常。但随机我收到此错误:

{ [Error: EBADF, write] errno: 9, code: 'EBADF' }

我读到这是因为文件是在关闭后写入的。所以,我的问题是:我做错了吗?有什么办法可以用decrypt.on("end")代替res.on("end")

更多信息

在同一个 res.on("end") 我有一个 q.defer().resolve 调用,因为这个方法是下载几个 .ts 文件,然后我需要把它们变成 MP4。

正如@mscdex 所说,没有必要关闭文件,但是,如果在文件实际完成之前解决了承诺,那么我可能正在处理损坏的文件。像这样:

  1. 下载1.ts
  2. 下载2.ts
  3. 下载3.ts
    • 这里所有的承诺都保存在一个数组中,然后我使用q.spread 等待所有承诺
  4. 文件 1.ts 写入
  5. 文件 1.ts 解决承诺
  6. 文件 2.ts 写入
  7. 文件 2.ts 解决承诺
  8. 文件 3.ts 解决承诺
  9. q.spread 知道所有承诺都已解决,因此它开始使用 .ts 文件
  10. 已写入文件 3.ts
    • 从现在开始,我将使用错误/不完整的文件。

【问题讨论】:

    标签: node.js request pipe fs


    【解决方案1】:

    您不需要显式调用file.close(),因为上游结束时文件流将自动关闭。

    如果您需要等到文件完全写入,请在file 上监听finish 事件:

    file.on('finish', function() {
      // resolve promise or do whatever
    });
    

    【讨论】:

    • 在那file.on("end")我也有一个承诺解决。检查更新以了解有关我在做什么的更多信息。
    • 可写流(例如file)不会发出end,当没有更多写入并且所有数据都已刷新时,它们会发出finish
    • 对不起,我的意思是 res.on("end");
    • finish 事件处理程序中解决您的承诺,因为响应流的end 事件很容易在文件流完成写入磁盘之前触发。
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2021-05-10
    • 2018-07-13
    • 2021-09-05
    相关资源
    最近更新 更多