AWS Lambda中的流转换导致写入结束错误

时间:2015-11-07 04:03:01

标签: node.js csv lambda

我正在尝试使用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)

请帮助理解和解决问题。

2 个答案:

答案 0 :(得分:3)

Lambda函数是按需部署和运行的,但是如果尚未销毁,则可以在现有实例上运行对同一lambda函数的其他调用。您无法控制此操作,但您需要确保代码可以正确处理它。

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

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

答案 1 :(得分:2)

您的var stream调用应该放在Handler函数内部,而不是声明为全局调用。其结果是将其范围限定为事件,使得如果Lambda函数仍处于活动状态并且多次调用,则每个事件将开始和结束其自己的流,而不是共享第一个事件可能在第二个事件之前关闭的流。完成后使用它。我有完全相同的错误,并能够通过此更改完美地解决它。