AWS Lambda中的stream转换会导致写入错误

我正在尝试使用Fastcsv nodejs包来转换CSV文件。 有趣的是,我的系统上的代码片段在本地很好地工作。 但是,如果我尝试将其与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) 

请帮助理解和解决问题。

Lambda函数是按需部署和运行的,但是对同一个lambda函数的额外调用可以在现有的实例上运行,如果它没有被销毁的话。 你不能控制这个,但你需要确保你的代码可以正确处理它。

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

您需要封装stream,以便每个调用都实例化为新的stream。

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