2017-10-30 7 views
2

Ich bin mit WebSocket verbunden, jedes Mal, wenn ich Nachricht erhalte ich speichern seinen Inhalt zu einer JSON-Datei.Wenn ich zwei oder mehr Nachrichten in der gleichen Sekunde es nicht richtig speichern.Wie kann i verhindern, dass jedes Mal, wenn ich Nachricht erhalten ich verwende:Json nicht richtig speichern mit node.js

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

jSON-Datei zu lesen, und

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

editierten jSON-Datei zu speichern.

+0

diese Antwort Ihre Frage nicht genau, sondern ein Weg, dass ich darüber nachdenke, diese Probleme zu beheben, wenn sie auftreten, besteht darin, beim Lesen von Dateien etwas wie das Paket [jsonrepair] (https://www.npmjs.com/package/jsonrepair) zu verwenden. – webelo

Antwort

1

Eine Möglichkeit, zu schützen ist einen einfachen Verriegelungsmechanismus zu machen:

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

Das ist cool und alles, aber Sie brauchen einen 'else' Block, der den Schreibvorgang anfordert, wenn die Ressource gesperrt ist. –

+0

Zustimmen, guter Punkt @JaredSmith –

0

Sie synchrone Lese-/Schreibfunktionen nutzen könnten - readFileSync und writeFileSync

+0

Das ist eine schreckliche Idee: Sie verschlechtern die Leistung für alle Anfragen, um ein zeitweiliges Problem zu beheben. –

+0

hängt vollständig von der Art der Anforderungen ab, die Ihr Server bearbeitet. Wenn es sich bei den meisten Anforderungen um Dateioperationen handelt, sehe ich keinen Unterschied bei der Implementierung von Sperren und Synchronisierungsvorgängen. – aega

+0

Der ** ganze Punkt ** der Existenz von node.js (siehe Ryan Dahls Posts seit seiner Veröffentlichung) ist, dass es sich um einen nicht blockierenden Event-Loop-basierten Server handelt. Wenn Sie jede Datei blockieren wollen, warum überhaupt Knoten *? Ich sage nicht, dass die Sync-Versionen keine Verwendung haben, sie existieren, aber sie sind nicht für den Produktionscode. –