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)
});
});
});
}
Aus diesem Grund verwenden Menschen Datenbanken statt JSON-Dateien. Sie behandeln alle Probleme der Dateisperre für Sie. – Quentin
@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
SQLite kommt mir in den Sinn. Und ja. Ja, so ist es. – Quentin