2015-11-07 32 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函數仍處於活動狀態並被多次調用,則每個事件將開始並結束其自己的流,而不是共享第一個事件可能在第二個事件之前關閉的流完成使用它。我有你完全相同的錯誤,並能夠完美解決這個變化。