В Node.js я создаю новый объект, когда "Требуется"? - PullRequest
24 голосов
/ 26 апреля 2011

Итак, я не уверен, что это так. если в ModuleA , у меня есть:

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

А в Модуль B у меня есть:

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

А в основной программе у меня есть:

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

Итак, когда я запускаю основную программу, думаю, я создам два "экземпляра" мангуста; один соединяется с путем A и другой соединяется с путем B, это верно?

Кроме того, в модуле B, прежде чем я подключусь к pathB, он подключен к pathA или ничего?

Спасибо.

Ответы [ 2 ]

16 голосов
/ 27 апреля 2011

Я только что сделал пару тестов с последним узлом V0.4.6.Я подтвердил следующее:

  1. Переменная, возвращаемая из «require», является одиночной.
  2. Последующие изменения изменят данные требуемого модуля среди всех других модулей, которые его включают.
  3. Связь с Mongoose немного странная.Даже если вы отключите его и установите новый путь подключения, он все равно будет использовать старый путь подключения.

Итак, что я имею в виду под пунктами 1 и 2 выше:

Если у вас есть Module Master :

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

И если у вас есть два других модуля:

Модуль 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

Таким образом, это синглтон.не только локально для модуля.

3 голосов
/ 22 сентября 2013

Я наткнулся на этот пост, и хотя принятый ответ показывает, что это Singleton, мой ответ на оригинальный вопрос «В Node.js я создаю новый объект, когда« Требуется »?»это «это зависит».

ответ / логика murvinlai по-прежнему верна в последних версиях Node (v0.10.18 на момент написания этой статьи), но это если у вас есть необходимые настройки файлов.Например, и я пытаюсь использовать более подробный пример, чтобы избежать путаницы, если у вас был следующий код «Пользователь» в User.js (структура отличается от ответа Мурвинлаи)

/**
 * 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, ноль.Кроме того, и я даже не уверен, что вам это понадобится, но вы можете использовать новый оператор по требованию (поскольку по сути это просто возврат функции).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());

И вы получите тот же результат.

Опять же, первоначальный вопрос был немного широким (и проблемы, возможно, в конечном итоге были с мангустом (как упоминалось в #3 ответа Мурвинлаи), но вышеприведенный пример является примером другого способа сделать что-то для получения нового объекта из каждого из require (). Теперь вы можете подумать, прежде чем делать это, так как бывают моменты, когдавам понадобится Singleton (скажем, для хранения кэшированных значений в ORM / Mapper), но в заключение вы создаете новый объект, это зависит ..

...