2016-04-05 8 views
0

複数のユーザーが同時にログインしていて、同じファイルを同時に書き込むことができます。 複数のユーザーがnodejs内の1つのファイルに書き込んでいるときに、ファイルの衝突を防ぐ方法を教えてください。nodejs内の複数のユーザーによって書き込まれる単一ファイル

+0

あなたのユースケースを共有してください。 –

+0

私のシステムでは、多くのユーザーが同時にログインしていて、画面上のものを変更してWebソケット経由でサーバーに送信します。 1つのファイルに保存します。だから私は(サーバー側で)ユーザーが何を変更しても受け入れる必要があります。実際には、これらの変更のそれぞれを1つのファイルに追加する必要があります。しかし、ファイルがすでに書き込まれている可能性があるので、単にファイルに書き込むことはできません。だから私は、どのような要求が最初に来たかに基づいて私のファイルが更新されているキューの並べ替えを見なければならないかもしれません。 – Umer

答えて

0

シンプルな解決策が1つのノードプロセスしか持たないと仮定すると、fs.writeFileSyncを使用することになります。

適切な方法は、rwlockを使用してファイルを適切にロックし、一度に1つのプロセスしか書き込めないようにすることです。

0

まあ、fs.writeFileSyncはイベントループをブロックし、ノードイベントキューの残りの非同期関数をブロックします。別のより良いアプローチは、semaphoreのようなモジュールを使用することです。

var sem = require('semaphore')(1); 
var server = require('http').createServer(req, res) { 
    res.write("Start your file write sir"); 

    sem.take(function() { 
     // Process your write to file using fs.writeFile 
     // And finish the request 
     res.end("Bye bye, your file write is done."); 
     sem.leave(); 
    }); 
}); 

これは、イベントループ全体をブロックすることなく、他のHTTPリクエストをブロックします。これまでに非同期であることを忘れないでください!

+0

私のシステムでは、基本的に、多くのユーザが同時にログインしていて、スクリーン上のものを変更します。これらはウェブソケット経由でサーバに送られます。それらの変更はすべて1つのファイルに保存する必要があります。だから私は(サーバー側で)ユーザーが何を変更しても受け入れる必要があります。 余分なことが必要ですか、下のコードが正常に機能しますか? //サーバ側では、次のようなものがあります。 socket.on( 'newObject'、function(data){ fs.writeFileSync(......); //データがファイルに追加されました。 } – Umer

関連する問題