25

だから、私にはわからないのはそれです。ModuleAの場合、次のようになります。

var mongoose = require('mongoose');
mongoose.connect(pathA);

そして、ModuleBには、次のものがあります。

var mongoose = require('mongoose');
mongoose.connect(pathB);

そしてメインプログラムでは、私は持っています:

var mA = require('./moduleA.js'), 
mB = require('./moduleB.js');

したがって、メインプログラムを実行すると、2つのマングースの「インスタンス」が作成されると思います。1つはpathAに接続し、もう1つはpathBに接続します、そうですか?

また、モジュールBでは、pathBに接続する前に、pathAに接続されていますか、それとも何も接続されていませんか?

ありがとう。

4

2 に答える 2

17

最新のノードV0.4.6でいくつかのテストを行いました。私は次のことを確認しました:

  1. 「require」から返される変数はシングルトンです。
  2. その後の変更により、必要なモジュールのデータが、それを含む他のすべてのモジュールの中で変更されます。
  3. マングースの接続は少し奇妙です。切断して新しい接続パスに設定しても、古い接続パスが使用されます。

したがって、上記のポイント1と2が意味するのは、次のとおりです。

モジュールマスターをお持ちの場合:

var myStr = 'ABC';
module.exports.appendStr = function(data) {
    myStr += ' ' + data;    
};
module.exports.output = function() {
    console.log("Output: " + myStr);
};

また、他に2つのモジュールがある場合:

モジュールA

var mc = require('./moduleMaster.js');
var ma = function() {mc.appendStr(' MA '); };
ma.prototype.output = function() {
  mc.output();
}
module.exports.create = function() {
    return new ma();
};

module.exports._class = ma;

モジュールB

var mc = require('./moduleMaster.js');
var mb = function() {mc.appendStr(' MB '); };
ma.prototype.output = function() {
  mc.output();
}
module.exports.create = function() {
    return new mb();
};

module.exports._class = mb;

ここで、モジュールAとモジュールBの両方を必要とするテストスクリプトを実行するときに、それらをインスタンス化して出力します。

mTestA.output();
mTestB.output();

次の出力が得られます。

ABC MA
ABC MA MB

それ以外の

ABC MA
ABC MB

したがって、シングルトンです。モジュールに対してローカルなだけではありません。

于 2011-04-26T20:13:21.267 に答える
3

この投稿に出くわしました。受け入れられた回答はシングルトンであることを示していますが、元の質問「Node.jsで、「必須」のときに新しいオブジェクトを作成していますか?」に対する私の回答です。「それは依存する」です。

murvinlaiの回答/ロジックは、最新バージョンのNode(この記事の執筆時点ではv0.10.18)でも当てはまりますが、必要なファイルをそのように設定している場合はそうです。たとえば、User.jsに次の「ユーザー」コードがある場合(murvinlaiの回答とは構造が異なる)、混乱を避けるために、より詳細な例を使用しようとしています。

/**
 * User Model
 */
function modelUser() {
    var User  = {
        /**
         * User::_id
         *
         * @var integer
         */
        "_id" : null,

        /**
         * Set id
         *
         * @param integer id
         * @return User
         */
        "setId" : function(id)
        {
            User._id = id; 
            return User;
        },

        /**
         * Get id
         *
         * @return integer
         */
        "getId" : function()
        {
            return User._id;
        },

    }

    return User;

}
exports.modelUser = modelUser;

上記のコードを使用した場合、多くの場合、変更を加えなくてもシングルトンの問題が発生しないことがわかります。IEと:

var user1 = require("./application/models/User.js").modelUser(); // In one module
var user2 = require("./application/models/User.js").modelUser(); // In another module

user1.setId(1);

console.log(user1.getId());
console.log(user2.getId());

1、nullを取得します。さらに、これが必要かどうかさえわかりませんが、requireでnew演算子を使用できます(基本的には関数を返すだけなので)。IEと:

var user1 = new require("./application/models/User.js").modelUser(); // In one module
var user2 = new require("./application/models/User.js").modelUser(); // In another module

user1.setId(1);

console.log(user1.getId());
console.log(user2.getId());

そして、同じ出力が得られます。

繰り返しになりますが、元の質問は少し広範でした(問題は最終的にマングースにあった可能性があります(murvinlaiの応答の#3で述べたように)が、上記は実際の新しいオブジェクトを生成するための別の方法の例ですそれぞれのrequire()をオフにします。シングルトン(たとえば、キャッシュされた値をORM / Mapperに格納する)が必要になる場合があるため、これを行う前に検討することをお勧めしますが、最後に新しいものを作成しますオブジェクト、それは依存します。

于 2013-09-22T11:46:25.333 に答える