我使用Nodejs流从S3下载一个文件,并作为可写流直接通过管道传输到本地文件夹。保存本地文件后,我会进行一些额外的处理,将本地文件重新调整为多个版本,并重新上传到S3。
下面的代码正确地从S3下载文件并存储在本地文件夹中。我已经确认这是有效的。
var readable = request(path)
, writable = fs.createWriteStream('files/images/' + fileName);
var localPath = 'files/images/' + fileName;
winston.log('info', "About to start download: " + asset.fileType);
readable.pipe(writable)
//once the file is saved, start processing it
.on('error', function(error){
winston.log('error', error);
})
.on('finish', function () {
winston.log('info', "file downloaded");
series(localPath, sizesKey.shift(), respond);
readable.end();
writable.end();
}).on('error', function(error){
winston.log('error', error);
});
当我在本地机器上运行脚本时,一切都正常工作,其余的脚本将继续运行,不会发生任何意外。
然而,当使用Node v.10.10从Amazon EC2 LINUX运行时,在运行上述代码后会引发以下错误,但并不总是同时发生。例如,错误可能出现在重新调整大小期间、成功重新调整大小之后,甚至在S3上传期间,所有这些都发生在上面的代码应该完成之后。
我的猜测是,我没有正确地关闭溪流,可以说,这只是关上了我的门。尽管如此,我现在还是在黑暗中拍摄。
错误如下:
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:980:11)
at Process.ChildProcess._handle.onexit (child_process.js:771:34)
首先将流分解为不同的对象,以便更好地了解错误的来源。也许是series(...)
函数?
此外,如果您已将winston配置为登录到某个文件,但该文件不可用,则可能会导致错误。尝试删除winston并替换为console.log
,看看这是否解决了问题
var readable = request(path),
writable = fs.createWriteStream('files/images/' + fileName);
var localPath = 'files/images/' + fileName;
// winston.log('info', "About to start download: " + asset.fileType);
console.log('about to start download: ' + asset.fileType)
readable.on('error', function(error) {
console.error('error from readable stream')
console.dir(err)
})
writable.on('error', function(error) {
console.error('error from writable stream')
console.dir(err)
})
writabale.on('finish', function() {
// winston.log('info', "file downloaded");
console.log('file downloaded')
// I'm not sure what this series function does
// series(localPath, sizesKey.shift(), respond);
// these end methods have already been called after the "finish" event fires
// readable.end();
// writable.end();
})
// it is best practice to setup all your event handlers before piping streams together, so the pipe call is moved to the bottom here
readable.pipe(writable)
这个问题的解决方案是GraphicsMagick没有正确安装,当我稍后在脚本中调用该包中的方法时,它崩溃了。为什么在调用这些命令时没有出现错误是另一个令人担忧的问题。