write()不写顺序吗?

时间:2017-02-11 22:38:52

标签: javascript node.js

我发现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

1 个答案:

答案 0 :(得分:1)

from django.conf import settings urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 是一个异步操作。这意味着可能无序地对它进行多次调用。

如果您希望您的写入按顺序发生,请使用stream.write,或使用stream.writeSync的回调参数对您的写入进行排序。