nodejsのドキュメントには
モジュールは、最初にロードされた後にキャッシュされます。これは、(とりわけ)require('foo')を呼び出すたびに、同じファイルに解決される場合、まったく同じオブジェクトが返されることを意味します。
ただし、スコープは指定されていません。ロードされたモジュールは、現在のHTTPリクエストまたは複数のHTTPリクエストでrequire('module')を複数回呼び出すためにキャッシュされますか?
nodejsのドキュメントには
モジュールは、最初にロードされた後にキャッシュされます。これは、(とりわけ)require('foo')を呼び出すたびに、同じファイルに解決される場合、まったく同じオブジェクトが返されることを意味します。
ただし、スコープは指定されていません。ロードされたモジュールは、現在のHTTPリクエストまたは複数のHTTPリクエストでrequire('module')を複数回呼び出すためにキャッシュされますか?
はい、そうです。
PHP などの他の一般的なサーバー環境とは異なり、node.js サーバーは要求が完了した後にシャットダウンしません。
優れたExpressフレームワークを使用しているとします。次の例が違いを理解するのに役立つかもしれません。
... // setup your server
// do a route, that will show a call-counter
var callCount = {};
app.get('/hello/:name', function(request, response) {
var name = request.params.name;
callCount[name] = (callCount[name] || 0) + 1
response.send(
"Hello " + name + ", you invoked this " + callCount[name] + " times");
});
});
電話curl localhost:3000/hello/Dave
をかけると、その後のすべての電話でより高い番号が表示されます。
最初の呼び出し:Hello Dave, you invoked this 1 times
2 回目の呼び出し:Hello Dave, you invoked this 2 times
... 等々 ...
そのcallCount
ため、そのルートへのリクエストによって変更されます。それがどこから来たかは問題ではなく、あなたがしているどのモジュールでも定義することができますrequire
。
とにかく、モジュールで定義されたこれらの変数は、サーバーの再起動時にリセットされます。Redisストア ( node-redisを参照)、ファイル システム上のファイル、MongoDBなどのデータベースなど、node.js プロセスから分離されたストアにそれらを配置することで、これに対抗できます。最終的にはあなた次第です。データがどこから来てどこへ行くのかを認識する必要があるだけです。
それが役立つことを願っています。