2016-06-27 14 views
0

Ich habe einen Express-Server ausgeführt. Eine der Routen post führt eine http-Anfrage durch, mit jeder dieser Anfragen möchte ich Daten in eine Datei protokollieren. Die Daten, die ich protokollieren werde, werden aus den gesendeten Daten extrahiert.Lesen/Schreiben in einer Datei asynchron auf einem Webserver

Daten, die ich sende, ist im XML-Format, also analysiere ich es zuerst mit xml2js Modul. Danach lese ich die Datei, damit ich meinen neuen JSON anhängen kann und danach schreibe ich das Ergebnis wieder in meine Datei. Ich benutze jsonfile Modul zum Lesen und Schreiben in meine JSON-Datei.

Worüber ich mir zur Zeit Sorgen mache, ist, wenn 2 Anfragen gleichzeitig kommen.

Mein Lese-/Schreibvorgang wird asynchron sein und ich werde Datenverlust bekommen. Ich glaube, dass das Problem offensichtlicher wird, wenn die Datei zu wachsen beginnt und Funktionen mehr Zeit benötigen, um fertig zu werden.

Also, wie gehe ich damit um? Ich bin absolut gegen die Verwendung readfilesync und writefilesync.

... 
    app.post('/testapi', function (req, res) { 

    request({ 
     "url": 'https://webservice.com', 
     "method": "POST", 
     "body" :req.body 
    }, 
     function(err, response, body){ 
     if (err) { 
      res.send(err); 
     } else { 
      res.send(body); 
      logSomeData(req.body); 
     } 
    }); 
}); 

function logSomeData(body) { 
    var currYear = new Date().getFullYear(), 
      currMonth = new Date().getMonth(), 
      fileName = __dirname + '/logs/' + currYear + '_' + currMonth + '.json'; 

    parseString(body, function (err, result) { 
     jsonfile.readFile(fileName, function(err, obj) { 

      var logData = {test : "test"}; 
      obj.push(logData); 

      jsonfile.writeFile(fileName, obj, {spaces: 2}, function(err) { 
       console.error(err) 
      }); 
     }); 
    }); 
} 
+1

Aus diesem Grund verwenden Menschen Datenbanken statt JSON-Dateien. Sie behandeln alle Probleme der Dateisperre für Sie. – Quentin

+0

@Quentin Meine Firma verwendet Oracle DB. Oracle hat zwar den nodejs-Treiber, aber die Installation ist immer noch klobig und der Treiber ist ziemlich frisch. Gibt es ein anderes Licht DB, das zu diesem Zweck dienen könnte und ist es das überhaupt wert? – Paran0a

+2

SQLite kommt mir in den Sinn. Und ja. Ja, so ist es. – Quentin

Antwort

-2

Sie können eine Art Middleware verwenden, um den Inhalt in einer Datei protokolliert werden, aber NodeJS könnten einige Performance-Probleme haben beim Lesen und Analysieren von großen XML-Dateien, in meiner Firma sind wir Parsen große XML-Dateien (150- 140MB), führt dies bei einer Single-Node-App zu einem kompletten Server-Freeze und Sie können keine weiteren Anfragen an den gleichen Service stellen.

Was ich vorschlagen, wenn Sie planen, mit viel XML-Analyse zu arbeiten, ist, einen anderen Node \ JAVA-Dienst zu machen, der das Logging \ parsing macht, damit Sie Ihren Hauptknotenserver für andere Anfragen verfügbar machen können.

Außerdem empfehle ich, Ihre XML-Dateien (besonders große) mit einer Art XML-Streaming-Bibliothek zu analysieren, so dass sie in Streams analysiert werden, anstatt sie alle im Speicher zu laden.

2

Das hört sich nach einem Job für eine Datenbank an, da Datenbank-Engines in der Regel besser darin sind, mehrere Verbindungen zu handhaben - dh Datensätze bei Bedarf "on-the-fly" hinzuzufügen.

Dann später können Sie die Informationen in eine Textdatei aussaugen, wenn Sie möchten ... oder einfach SQL-Abfragen auf die Datenbank anwenden, um die Informationen zurück zu bekommen, die Sie wirklich brauchen.

Die Art der zu verwendenden Datenbank ist wahrscheinlich nicht Gegenstand dieser Frage und hängt von Ihren Anforderungen und Ressourcen ab.