我正在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
回调中运行路由回调,但是如何以正确的方式执行此操作我自己无法弄清楚...
答案 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/
中的模型,以获得组织用户模型的替代方法