Структурирование модуля NodeJS - переменные и методы

Я хочу создать модули для структурирования моего приложения 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;

Это тоже работает, но с одной оговоркой; Я не нашел способа получить доступ к свойствам пользователя из замыканий. Если я правильно понимаю, со второй реализацией я не могу. Это означает, что если мне нужно передать функцию в библиотеку db в качестве обратного вызова для редактирования свойств пользователя, я не могу. Это выглядело бы примерно так:

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

Это не сработает.

Думаю, мой вопрос: как лучше всего решить эту проблему? Это метод, который я представил в первом блоке кода? Это кажется довольно громоздким, беспорядочным и подверженным конфликтам переменных. Мне страшно.

Заранее спасибо!

27
задан Yossale 30 January 2014 в 19:29
поделиться