【问题标题】:Node process exit before writeStream ends在 writeStream 结束之前节点进程退出
【发布时间】:2015-09-10 08:42:33
【问题描述】:

我有一个 nodejs 程序从服务器下载一堆文件。问题是在文件实际下载之前进程退出,所以我得到一个损坏的文件。

for(var i = 0; i < items.length; i++){
    var file = fs.createWriteStream(items[i].filename);
    var request = http.get(items[i].url, function (response) {
      console.log('got:', i);
      response.pipe(file);
    });
    request.on('end', function () {
      console.log('done with ' + filePath);
    });
}

但是当最后一个请求收到它的响应时,进程退出。我从来没有得到“完成”日志。

有人有想法吗?

谢谢!

【问题讨论】:

  • 这是因为您的代码的异步性。基本上,您在触发回调之前已经退出了循环。
  • 我知道,我尝试了 es6-promise 和 sync-request 但没有成功...
  • 您是否尝试过我在回答中提供的代码?

标签: node.js http pipe


【解决方案1】:

您错误地处理了异步性。

尝试使用名为 async 的库并像这样使用它

async.eachSeries(items, function (item, callback) {
   var file = fs.createWriteStream(item.filename);
   var request = http.get(item.url, function (response) {
       response.pipe(file);
   });
   request.on('end', function () {
       console.log('done with ' + filePath);
       callback(null);
   });
}, function (err) {
    console.log('All done!');
});

【讨论】:

  • 谢谢你的回答,它看起来很好,但我不能让它做我想做的事。我想我遗漏了一些东西......在我的主循环中,我将对象添加到 downloadQueue 对象数组并使用 async.each() 方法遍历它,但该过程仍然过早退出:/
  • 那我猜它在你代码的其他地方。您可以在调用回调之前检查代码的哪一部分退出
  • 问题是我从来没有得到“全部完成!”日志,似乎节点不等待异步退出其进程
  • 嗯,很奇怪。我从来没有得到过这种行为。但就我而言,我真的很确定在调用回调之前没有代码返回。
  • 算了,问题出在请求上,你的代码解决了原来的问题。多亏了你,它现在可以完美运行了!
猜你喜欢
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 1970-01-01
  • 2014-01-04
  • 2017-11-03
  • 2017-01-19
相关资源
最近更新 更多