我有这段代码:
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 call,因为这个方法正在下载几个.ts文件然后我需要将它们变成MP4 。
正如@mscdex所说,没有必要关闭文件,但是,如果在文件实际完成之前解析了promise,那么我可能正在使用损坏的文件。像这样:
q.spread
等待所有这些承诺q.spread
知道所有承诺都已解决,因此它开始使用.ts文件答案 0 :(得分:1)
您不需要显式调用file.close()
,因为文件流将在上游结束时自动关闭。
如果您需要等到文件完整写入,请在finish
上收听file
事件:
file.on('finish', function() {
// resolve promise or do whatever
});