我發現方法的stream.Writable
類不會順序寫入數據。當我以塊發送附件到服務器時,如果沒有延遲發生,此代碼按錯誤順序組裝數據塊。如果我在循環中間放置了一個類似console.log()的調試消息(如轉儲數據以實際監視正在寫入的內容),則此錯誤消失。那麼,這段代碼中的競爭條件是什麼?看起來我正在強制執行文件的順序組裝,所以我不明白什麼是錯的。write()不寫序列?
我的代碼:
function join_chunks(company_id,attachment_id,num_chunks) {
var stream;
var file;
var output_filename=ATTACHMENTS_PATH + '/comp' + company_id + '/' + attachment_id + '.data';
var input_filename;
var chunk_data;
var chunk_count=0;
stream=fs.createWriteStream(output_filename,{flags:'w+',mode: 0666});
console.log('joining files:');
for(var i=0;i<num_chunks;i++) {
input_filename=ATTACHMENTS_PATH + '/comp' + company_id + '/' + attachment_id + '-' + (i+1) + '.chunk';
console.log(input_filename);
fs.readFile(input_filename , (err, chunk_data) => {
if (err) throw err;
stream.write(chunk_data,function() {
chunk_count++;
if (chunk_count==num_chunks) {
console.log('join finished. closing stream');
stream.end();
}
});
});
}
}
控制檯:
joining files:
/home/attachments/comp-2084830518/67-1.chunk
/home/attachments/comp-2084830518/67-2.chunk
/home/attachments/comp-2084830518/67-3.chunk
/home/attachments/comp-2084830518/67-4.chunk
join finished. closing stream
節點版本:v6.9.2
'fs.readFile'是異步的;您立即對'num_chunks'文件操作進行排隊,但它們不一定按照您排隊的順序完成。你可能需要等到他們全部完成,然後把它們整理好並寫下來。 – qxz
@qxz,好眼睛。閱讀是問題,而不是寫作。我用順序流代替了閱讀,一切運行良好。如果你回答這個問題,我會接受它。另一個答案是錯誤的。 – Nulik