2017-10-30 9 views
2

私はwebSocketに接続しています。メッセージを取得するたびに、jsonファイルにコンテンツを保存します。同じ秒に2つ以上のメッセージがある場合は、正しく保存しません。Jsonは正しくnode.jsを使用して保存しません

fs.readFile(bought_path,'utf-8',(err,data) =>{ ... 
    //do something 

は、JSONファイルを読むために、そして

fs.writeFile(bought_path, JSON.stringify(kupljeni_itemi) , 'utf-8'); 

は、編集されたJSONファイルを保存するには:?私はメッセージを取得するたびに、私が使用していますことを防ぎます。守るために

+0

これはまさにあなたの質問に答えるが、1つの方法はありませんこれらの問題が発生した場合に修正しようと考えているのは、ファイルを読むときに[jsonrepair](https://www.npmjs.com/package/jsonrepair)パッケージを使用することです。 – webelo

答えて

1

一つの方法は、単純なロック機構を作ることです。

let isLocked = false; // declare it in an upper scope. 

if (!isLocked) { // check if it is not locked by other socket call. 
    isLocked = true; // set the lock before writing the content 
    fs.writeFile(file, json, (err) => { 
    isLocked = false; // unlock when you get the response 
    }) 
} 
+1

これは素晴らしいことですが、リソースがロックされている場合は書き込みを再キューする 'else'ブロックが必要です。 –

+0

良い点@JaredSmith –

0

あなたは、同期読み取り/書き込み機能を使用することができます - readFileSyncwriteFileSync

+0

これはひどい考えです。断続的な問題を解決するためのすべての要求のパフォーマンスが低下しています。 –

+0

は、サーバーが処理している要求の性質によってまったく異なります。ほとんどのリクエストがファイル操作の場合、ロックと同期操作の実装に違いはありません。 – aega

+0

node.jsの存在の**点**(彼がそれをリリースしたときのRyan Dahlの記事を参照)は、それがノンブロッキングイベントループベースのサーバーだということです。すべてのファイルioをブロックする場合は、なぜnode *を使うのですか?私は、同期バージョンには役に立たないとは言わないが、それらは存在するが、実動コードではない。 –

関連する問題