Подтвердить что ты не робот

В Node.js, я создаю новый объект, когда "Требовать"?

Итак, я не уверен в этом. если в 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');

Итак, когда я запускаю основную программу, я предполагаю, что создам два экземпляра mongoose, один из которых подключается к pathA, один подключается к pathB, это правильно?

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

Спасибо.

4b9b3361

Ответ 1

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

  • Переменная, возвращаемая из "require", является одноэлементной.
  • Последующие изменения изменят данные требуемого модуля среди всех других модулей, которые его включают.
  • Соединение Mongoose немного странно. Даже если вы отключите и установите его на новый путь подключения, он по-прежнему использует старый путь подключения.

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

Если у вас есть Мастер модулей:

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;

Теперь, когда вы запускаете тест script, который требует как модуля A, так и модуля B, создайте их и выполните вывод:

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

Вы получите следующий результат:

ABC MA
ABC MA MB

вместо

ABC MA
ABC MB

Следовательно, это одноэлемент. не только локально к модулю.

Ответ 2

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

murvinlai answer/logic по-прежнему сохраняется в последних версиях 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;

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

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

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