私はエクスプレスサーバーを稼働させています。 post
ルートの1つがhttp要求を行い、これらの要求のそれぞれでデータをファイルに記録したいとします。私が記録するデータは、送信されているデータから抽出されます。ウェブサーバー上でファイルを非同期で読み書きする
私が送信しているデータはxml形式ですので、まずxml2jsモジュールで解析します。 その後、ファイルを読み込んで新しいJSONを追加してから、その結果をファイルに書き戻します。私はjsonfile
モジュールを使用してjsonファイルを読み書きしています。
私が現在心配しているのは、2つのリクエストが同時に発生する場合です。
私の読み取り/書き込みは非同期になり、データが失われます。私は、ファイルが成長し始めて機能が終了するのに時間がかかるので、問題がより明らかになると信じています。
どうすれば対応できますか? 私は絶対にreadfilesync
と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)
});
});
});
}
これは、人々がJSONファイルの代わりにデータベースを使用する理由です。彼らはあなたのためのファイルロックのすべての問題を処理します。 – Quentin
@Quentin私の会社はOracle DBを使用しています。オラクルはnodejsドライバを持っていますが、インストールはやっかいであり、ドライバは新鮮です。この目的のために役立つ可能性のある他のライトDBがありますか? – Paran0a
SQLiteが気になる。はい。はい、そうです。 – Quentin