node.jsにモジュールが複数回必要な場合は、同じオブジェクトを戻します(require()
は前の呼び出しをキャッシュします)。node.jsに同じモジュールが必要な場合のrequire()の働き
サブロガーモジュールを登録できるメインロガーモジュールがあるとします。 (これらは、メインのロガーモジュールlog()
機能によって、ロギング、実際に作るしかし、そのは、ここでは関係ありません。。)
私はサブモジュールを追加するには、メインロガーモジュールでこのようなものを持っている:
module.addRedisLogger = function(rclient) {
modulesArray.push(require('./redis.js')(rclient, loggingEnabled, module));
}
私はRedisのクライアントのインスタンスを作成し、私はすぐにこのようにそれにロガーを追加することができます。
var sub = redis.createClient();
logger.addRedisLogger(sub);
をサブモジュールでは、私は次のようにログインするために開始します。
module.startLogging = function() {
rclient.on("message", messageCallback);
rclient.on("pmessage", pmessageCallback);
}
そして、このようにロギングを停止:
module.stopLogging = function() {
rclient.removeListener("message", messageCallback);
rclient.removeListener("pmessage", pmessageCallback);
}
しかし、これまで私が理解として、二番目を割り当てることと同じオブジェクトでrequire()
に戻ってくるため、この技術を用いて、私は一つだけRedisのロガーインスタンスを割り当てることができます新しいredis
パラメータを渡すと、前の値が上書きされます。そのため、最初のredis loggerインスタンスを呼び出すので、2番目のインスタンスのログを停止するので、最初のredis loggerインスタンスのログを停止することはできません。
var sub1 = redis.createClient();
var sub2 = redis.createClient();
sub1.subscribe("joinScreen1");
sub2.subscribe("joinScreen2");
logger.addRedisLogger(sub1);
logger.addRedisLogger(sub2);
// running redis-cli PUBLISH joinScreen1 message1
// running redis-cli PUBLISH joinScreen2 message2
logger.log("Lets stop the first logger);
logger.modulesArray[0].stopLogging()
// running redis-cli PUBLISH joinScreen1 message1
// running redis-cli PUBLISH joinScreen2 message2
私はこの出力を取得する場合を除き:
// Message received on channel joinScreen1: message1
// Message received on channel joinScreen2: message2
// Message received on channel joinScreen1: message1
最初のロガーは今番目のインスタンスを指すので、我々はこれを取得する必要があり
は例を見てみましょう。したがって、redis
も第2のクライアントを指しています。
しかし、その代わりに、私はこれを取得:
// Message received on channel joinScreen1: message1
// Message received on channel joinScreen2: message2
// Message received on channel joinScreen2: message2
だから、期待通りにプログラム設計で動作しますが、コードによって期待できないとして。だから私はそれが今働くように動作させたいが、なぜそれがそのように機能するのか分からない。
UPDATE:
ロングバージョン
module.js
var util = require("util");
module.exports = function() {
var module = {};
module.show = function() {
console.log(util.client);
}
module.set = function(value) {
util.client= value;
}
return module;
};
メイン。この出力を発生しますmain.js
を実行するJS
var util = require("util");
util.client = "waaaa";
var obj = require('./module')();
obj.show();
obj.set("weeee");
console.log(util.client);
:
C:\Users\me\Desktop>node main.js
waaaa
weeee
だから
require()
は初めてのような非常に同じオブジェクトをバック与えます。それ以来私がそれを変更した場合、同じオブジェクトであるため変更もそこにあります。
ここで、変数redis
はここではclient
と同じで、redis接続への参照を保持しているとします。コンストラクタが2回目に実行されると、それが最初のものを上書きします。そのため、最初のredisクライアントのロガーから通知を受け取ることを除いて、リスナーを削除できませんでした。
私は投稿内容から質問を解読するのに苦労しています。タイトルの質問は重複している可能性が高いですが、私はそれがあなたが要求しているとは思わない、あなたはすでにrequire()の作品とキャッシュを知っているようです。結局のところ、これは論理的な問題になり、ロジック(コード)は簡単に追跡できるようにポストに編成されていません(あまりにも多くは欠落しています)。 –
私の質問が更新されました。 – NoNameProvided