2015-11-07 57 views
1

我试图使用Fastcsv nodejs包转换CSV文件。有趣的是,代码片段在我的系统上很好地工作。但是,如果我尝试将它与AWS lambda程序集成,它会在写入错误后提供写入。AWS Lambda中的流转换导致写入错误

var stream = fs.createReadStream(s3EventInfo.inputDownloadLoc) 
.pipe(csv.parse({headers: true})) 
//pipe the parsed input into a csv formatter 
.pipe(csv.format({headers: true})) 
//Using the transfrom function from the formatting stream 
.transform(function(row, next){ 
    transformLine(row, next); 
}) 
.pipe(fs.createWriteStream(s3EventInfo.outputFileLoc)) 
.on("end", function(){ 
    callback(); 
}); 

这里是AWS日志中的错误..

Error: write after end 
at writeAfterEnd (_stream_writable.js:133:12) 
at PassThrough.Writable.write (_stream_writable.js:181:5) 
at write (_stream_readable.js:602:24) 
at flow (_stream_readable.js:611:7) 
at _stream_readable.js:579:7 
at process._tickDomainCallback (node.js:486:13) 

在理解和解决问题请帮助。

回答

2

Lambda函数是按需部署和运行的,但是对相同lambda函数的额外调用可以在现有实例上运行(如果它尚未销毁)。你无法控制这个,但你需要确保你的代码可以正确处理它。

如果您的流正在全局范围内定义,那么您的问题是这些后续调用正在重用已经收到“结束”事件的流。

您需要封装这些流,以便它们为每个调用实例化。

1

你的var stream调用应该放在你的Handler函数中,而不是被声明为全局的。这样做的结果是将其范围扩展到事件,以便如果Lambda函数仍处于活动状态并被多次调用,则每个事件将开始并结束其自己的流,而不是共享第一个事件可能在第二个事件之前关闭的流完成使用它。我有你完全相同的错误,并能够完美解决这个变化。