2014-01-06 32 views
0

我正在使用Nodejs流从S3下载文件,并将其作为可写流直接传输到本地文件夹。保存本地文件后,我会做一些额外的处理,将本地文件重新调整为多个版本并重新上传到S3。错误:随机出现的spawn ENONT(流相关)

以下代码正确地从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) 

回答

1

开始打破流成不同的对象,这样你在错误是来自一个更好的想法。也许这是series(...)的功能?

此外,如果您有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) 
0

这个问题的解决方案被证明是GraphicsMagick工具不安装不正确,当我打电话从包装方法后来在剧本上下它坠毁了。为什么这些错误在调用这些命令时没有出现,这完全是另一个问题。