如何在ExpressJS中正确组织路线?

时间:2014-01-01 19:10:44

标签: node.js express routes mongoose

我正在NodeJS开发我的第一个测试应用程序并遇到以下问题:我无法弄清楚如何在ExpressJS框架中正确组织路由。例如,我想做注册,所以我创建路线,如:

app.get('/registration', function (request, response) {
    if (request.body.user.email && request.body.user.password) {
        var user = new User();
        var result = user.createNew(request.body.user.email, request.body.user.email);

        // do stuff...
    }

    response.render('registration.html', config);
});

用户功能看起来像这样(不是最终的):

function User() {
    var userSchema = new mongoose.Schema({ 
        'email': { 
            'type': String, 
            'required': true, 
            'lowercase': true, 
            'index': { 'unique': true }
        },
        'password': {
            'type': String, 
            'required': true
        }
    });

    var userModel = mongoose.model('users', userSchema);

    this.createNew = function(email, password) {
        var new_user = new users({'email': email, 'password': password});

        new_user.save(function(err){
            console.log('Save function');

            if (err)
                return false;

            return true;
        });
    }
}

我尝试做一些像MVC这样的结构化应用程序。问题是save方法是异步的,每次我注册新用户get registration.html而不等待结果。

基本上我需要在save回调中运行路由回调,但是如何以正确的方式执行此操作我自己无法弄清楚...

2 个答案:

答案 0 :(得分:1)

this.createNew = function(email, password, callback) {
    var new_user = new users({'email': email, 'password': password});

    new_user.save(function(err){
        console.log('Save function');

        if (err)
            // return false;
            callback (false);
        else
            //return true;
            callback (true);
    });
}

我发现每当我使用某个模块(例如db)并且它正在使用回调时,我经常必须对我包裹它的任何函数使用回调(除非我不关心结果)。

下面:

app.get('/registration', function (request, response) {
    if (request.body.user.email && request.body.user.password) {
        var user = new User();
        // var result = user.createNew(request.body.user.email, request.body.user.email);

        user.createNew(request.body.user.email, request.body.user.email, function (results) {
             // do something with results (will be true or false)
             // not sure why you have this with the actual registration stuff,
             // but it's your site. :)
             response.render('registration.html', config);
        });
    }
});

此外,您可能希望将对象方法放在原型中,而不是:

this.createNew = function (....) {}

尝试:

User.prototype.createNew = function ( ... ) { }

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures#Performance_considerations了解原因。

答案 1 :(得分:0)

有关组织Node.js应用程序的起点,请尝试阅读此demo demo.js应用程序中的源代码。 Click here for the link

这是一个相当受欢迎的回购,我经常在从头开始构建Node.js应用程序时引用它。

对于您的项目,它可能是一个很好的参考,因为它是以MVC风格完成的,它使用的是猫鼬。路线被组织成一个文件,可以在config/routes.js中找到。您还应该查看app/models/中的模型,以获得组织用户模型的替代方法