管道两次http请求时出现随机错误
Random error when piping twice http request
我有这个代码:
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.ts
- 下载2.ts
- 下载3.ts
- 这里所有的承诺都保存在一个数组中,然后我使用
q.spread
等待所有承诺
- 文件1.ts已写入
- 文件1.ts解决承诺
- 文件2.ts已写入
- 文件2.ts解决承诺
- 文件3.ts解决承诺
q.spread
知道所有承诺都已解决,因此它开始使用 .ts 文件
- 文件3.ts已写入
- 从现在开始,我将使用 wrong/incomplete 文件。
您不需要显式调用file.close()
,因为文件流会在上游结束时自动关闭。
如果需要等到文件完全写入,请监听 file
上的 finish
事件:
file.on('finish', function() {
// resolve promise or do whatever
});
我有这个代码:
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.ts
- 下载2.ts
- 下载3.ts
- 这里所有的承诺都保存在一个数组中,然后我使用
q.spread
等待所有承诺
- 这里所有的承诺都保存在一个数组中,然后我使用
- 文件1.ts已写入
- 文件1.ts解决承诺
- 文件2.ts已写入
- 文件2.ts解决承诺
- 文件3.ts解决承诺
q.spread
知道所有承诺都已解决,因此它开始使用 .ts 文件- 文件3.ts已写入
- 从现在开始,我将使用 wrong/incomplete 文件。
您不需要显式调用file.close()
,因为文件流会在上游结束时自动关闭。
如果需要等到文件完全写入,请监听 file
上的 finish
事件:
file.on('finish', function() {
// resolve promise or do whatever
});