Я хочу создать модули для структурирования моего приложения NodeJS, но я немного растерялся, и я не нашел ничего (с часами поиска), которое было бы полностью определенным по этому вопросу.
Скажем, я хотел бы создать «пользовательский» модуль, из которого я могу создавать новых пользователей в своем коде, используя что-то вроде:
var newUser = new User();
В идеале, мне потребуется мой модульв верхней части моего кода, используя что-то вроде:
var User = require('../lib/user');
Это прекрасно работает.Вопрос в том, как мне структурировать пользовательский модуль?Является ли следующий способ наилучшим?
module.exports = function User() {
var authorized = false;
var username = undefined;
var password = undefined;
var statistics = undefined;
this.authorized = function() {
return authorized;
}
this.username = function() {
return username;
}
this.statistics = function() {
return statistics;
}
}
Я пишу методы получения и установки для переменных моего модуля, что позволяет мне скрывать вещи, к которым я не хочу, случайно обращаться из другого кода.Тем не менее, я делал это раньше:
function User() {
this.authStatus = false;
this.email;
this.displayName;
this.inSession;
}
User.prototype.isAuthenticated = function() {
return(this.authStatus && this.email && this.displayName)
}
User.prototype.isInSession = function() {
return(this.inSession && this.isAuthenticated());
}
exports.User = User;
Это тоже работает, с одной оговоркой;Я не нашел способ доступа к свойствам пользователя из замыканий.Если мое понимание верно, со второй реализацией я не могу.Это означает, что если мне нужно передать функцию в библиотеку БД в качестве обратного вызова для редактирования свойств пользователя, я не смогу.Это выглядело бы примерно так:
User.prototype.login = function() {
db.doDbStuff('get user data query', function(_error, _result) {
this.username = _result[0].name; //this code will not work
});
}
Насколько я понимаю, код не работает, потому что ключевое слово "this" находится в области действия замыкания, а не пользователя.Даже если бы код был помещен в пользовательскую функцию:
function User() {
this.login = function() { //you know
Это не сработало бы.
Я думаю, мой вопрос, каково лучшее решение этой проблемы?Это метод, который я представил в первом блоке кода?Это кажется довольно громоздким, грязным и подверженным переменным столкновениям.Я напуган.
Заранее спасибо!