我发现write()
类的stream.Writable
方法不会按顺序写入数据。当我以块的形式向服务器发送附件时,如果没有发生延迟,此代码会以错误的顺序组装数据块。如果我在循环中间放置一个类似console.log()的调试消息(比如转储数据以实际查看正在写的内容),这个bug就会消失。那么,这段代码中的竞争条件是什么?看起来我正在强制执行文件的顺序组装,所以我不明白出了什么问题。
我的代码:
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
答案 0 :(得分:1)
from django.conf import settings
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
是一个异步操作。这意味着可能无序地对它进行多次调用。
如果您希望您的写入按顺序发生,请使用stream.write
,或使用stream.writeSync
的回调参数对您的写入进行排序。