我正在尝试使用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)
请帮助理解和解决问题。
答案 0 :(得分:3)
Lambda函数是按需部署和运行的,但是如果尚未销毁,则可以在现有实例上运行对同一lambda函数的其他调用。您无法控制此操作,但您需要确保代码可以正确处理它。
如果您的流正在全局范围内定义,那么您的问题是这些后续调用正在重新使用已经收到'结束的流。事件
您需要封装流,以便为每次调用实例化它们。
答案 1 :(得分:2)
您的var stream
调用应该放在Handler函数内部,而不是声明为全局调用。其结果是将其范围限定为事件,使得如果Lambda函数仍处于活动状态并且多次调用,则每个事件将开始和结束其自己的流,而不是共享第一个事件可能在第二个事件之前关闭的流。完成后使用它。我有完全相同的错误,并能够通过此更改完美地解决它。