为了分离业务逻辑和数据访问层,我以非事件驱动的方式分离了文件和文件夹。以下是我采用的用户注册过程的示例,这是我的业务逻辑层文件。
var userDA = require('./../DataAccess/UserDA');
module.exports = {
signUpUser: function(userGiven)
{
//Some bookeeping
userGiven.userType = "admin";
return userDA.save(tutorGiven);
}
}
这是我的数据访问文件
"use strict";
var mongoose = require('mongoose');
if(!mongoose.connection)
mongoose.connect('mongodb://localhost/test');
var User = require('./../models/User');
module.exports ={
save : function(UserGiven){
var pass = true;
var user = new User(UserGiven);
user.save(function (err) {
if(err) {
console.log(err);
pass = false;
}
});
return pass;
},
getUser: function (email) {
var user = null;
user.findOne({email:email},function(err,foundUser){
if(err)
console.log(err);
else
user = foundUser;
});
return user;
}
}
这是一个中等大小的真实项目,作为nodejs的新手,我想知道并且需要专家建议,如果采用这种设计方法会有什么问题吗?
答案 0 :(得分:1)
您正遇到节点中异步编程新手的经典陷阱。例如,请考虑以下代码:
setTimeout(function () {
console.log('timer');
}, 200);
console.log('done');
将输出以下内容:
done
timer
原因是setTimeout正在为以后调度异步工作。实际发生的是setTimeout
函数立即返回,调用console.log('done')
,然后~200 ms后调用回调函数并调用console.log('timer')
。
更合适的方法是使用回调来指示您的工作何时完成。像这样:
"use strict";
var mongoose = require('mongoose');
if(!mongoose.connection)
mongoose.connect('mongodb://localhost/test');
var User = require('./../models/User');
module.exports ={
save : function(UserGiven, callback){
var pass = true;
var user = new User(UserGiven);
user.save(function (err) {
if(err) {
console.log(err);
return callback(err);
}
return callback();
});
},
getUser: function (email, callback) {
user.findOne({email:email},function(err,foundUser){
if(err) {
console.log(err);
return callback(err);
}
return callback(null, foundUser);
});
}
}
这遵循错误优先回调的惯例,其中回调的第一个参数是错误,第二个是数据。您的第一个代码段将如下所示:
var userDA = require('./../DataAccess/UserDA');
module.exports = {
signUpUser: function(userGiven, callback) {
//Some bookeeping
userGiven.userType = "admin";
userDA.save(tutorGiven, callback);
}
}
现在,您可以这样致电signUpUser
:
var userRepo = require('<PATH TO FILE>');
var someUser = {};
userRepo.signUpUser(someUser, function(err, user) {
if (err) {
// oops!
}
// do whatever you need to accomplish after the user is signed up
});