ディスク上のデータ ファイルを読み書きする Web サーバーがあります。単一の Web 要求でのみファイルに書き込みたいと思います。
これが私の問題を説明するサンプルプログラムです。「/tmp/rw.txt」に状態ファイルを保持し、Web ヒットごとに整数の内容をインクリメントします。このプログラムを実行してから のようなものを実行するab -n 10000 -c 1000 http://localhost:3000/
と、同じ値が複数のヒットによってファイルから読み取られ、複数回書き込まれることが示されます。
注: flock() とfs-extについては知っています。ただし、flock() はファイルを現在のプロセスにロックします。ここでのすべてのアクセスは同じプロセス内にあるため、flock() は機能しません (そして、この例はかなり複雑になります)。
また、通常はエクスプレス、非同期などを使用して、このほとんどを実行することに注意してください。例のために基本に固執するだけです。
var http = require("http"),
fs = require("fs");
var stateFile = "/tmp/rw.txt";
var server = http.createServer(function(req, res) {
var writeNum = function(num) {
var ns = num.toString(10);
console.log("Writing " + ns);
fs.writeFile(stateFile, ns, function(err) {
if (err) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.end(err.message);
} else {
res.writeHead(200, {"Content-Type": "text/plain"});
res.end(ns);
}
});
};
switch (req.url) {
case "/reset":
writeNum(0);
break;
case "/":
fs.readFile(stateFile, function(err, data) {
if (err && err.code == "ENOENT") {
// First time, set it to zero
writeNum(0);
} else if (err) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.end(err.message);
} else {
writeNum(parseInt(data, 10) + 1);
}
});
break;
default:
res.writeHead(404, {"Content-Type": "text/plain"});
res.end("No such resource: " + req.url);
}
});
server.listen(3000);