Непонятное поведение module.exports в NodeJS

Каким образом получается, что значение controllers.user.foo переписывается значением controllers.account.foo?

./controllers/user.js
module.exports = function () {
    this.foo = 'bar';
};

./controllers/account.js
module.exports = function () {
    this.foo = 'baz';
};

app.js
var controllers = {};
controllers.user = require('./controllers/user');
controllers.account = require('./controllers/account');
console.log(controllers.user.foo) // baz
  • Вопрос задан
  • 4030 просмотров
Решения вопроса 1
@kachok
Я не силен в javascript, но попробуйте так:
var controllers = {};
var User = require('./controllers/user');
var Account = require('./controllers/account');
controllers.user = new User();
controllers.account = new Account();
console.log(controllers.user.foo);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Все правильно, this в вашем примере ссылается не на объект, а на module.exports. А что вы пытаетесь сделать?
UPD:
Не факт, что так нужно было, не понятна задача, что нужно было сделать? В зависимости от задачи можно заменить this.variable = "value" на замыкание:
// user.js
module.exports = function() {
	var foo = 'bar';
	var fn = function() {
		// тут будет доступно значение foo = 'bar'
		return foo;
	}
	return fn;
}

И account.js по аналогии
Потом можно вызывать:
var controllers = {};
controllers.user = require('./controllers/user')(); // обратите внимание на ()
controllers.account = require('./controllers/account')();
console.log(controllers.user()); // bar
console.log(controllers.account()); // baz

Таким образом, нет порождения новых объектов, но переменные сохраняются в замыканиях и оттуда возвращаются функциями.
Другой вариант, интереснее для вашего случая:
// user.js
module.exports = { foo:  'bar' };

И account.js по аналогии
Потом можно вызывать:
var controllers = {};
controllers.user = require('./controllers/user');
controllers.account = require('./controllers/account');
console.log(controllers.user.foo); // bar
console.log(controllers.account.foo); // baz

Но по вашему коду видно, что вы еще не определились что такое user и account - это функции или прототипы? Это контроллеры или модели? Советую не использовать слова контроллер и модель, пока не определитесь, что это такое.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы