【问题标题】:Stream transformations in AWS Lambda result in write after end errorAWS Lambda 中的流转换导致结束后写入错误
【发布时间】:2016-02-08 07:41:38
【问题描述】:

我正在尝试使用 Fastcsv nodejs 包转换 CSV 文件。有趣的是,代码 sn-p 在我的系统上本地运行良好。但是,如果我尝试将它与 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)

请帮助理解和解决问题。

【问题讨论】:

    标签: node.js csv lambda


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!我在我的代码中遇到了这种情况,我在处理程序函数的外部(全局)定义了 Writable,我看到了 OP 的错误。将 Writable 移到处理程序函数内部解决了我的问题,因为无论 Lambda 之前在哪个服务器上运行过,它都会在每次运行 Lambda 函数时新创建。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2020-06-28
      • 2018-06-20
      • 1970-01-01
      相关资源
      最近更新 更多