当涉及到从包含数据库调用的方法返回响应时,我卡住了。
这是我需要的示例…
service.js
module.exports = {
getUserStatus: function(userId){
return User
.find()
.where({userId: userId)
.exec(function(err, user){
return user.status;
}
}
}
在这个service.js中,我应该获取用户的状态,如果我在exec
方法中console.log(user.status)
,则打印OK(我获得了状态)。
问题是我需要service.js
之外的这个结果:
controller.js
// this code is extracted from longer file, just for demo purpose.
// userService is required 'service.js'
index: function(req, res) {
var status = userService.getUserStatus(req.session.User.id);
console.log(status);
return res.view({userStatus: status});
}
如果我在这里console.log(status)
,它将是未定义的。我猜这与承诺和东西有关(因为异步调用),但不确定什么是正确的方法。
getUserStatus
包含异步代码,所以它需要一个回调:
module.exports = {
getUserStatus: function(userId, cb){
User.findOne().where({userId: userId}).exec(function(err, user){
if (err) return cb(err);
return cb(null, user.status);
});
}
}
然后在使用它的代码中:
index: function(req, res) {
userService.getUserStatus(req.session.User.id, function(err, status) {
// If an error was returned from the service, bail out
if (err) {return res.serverError(err);}
console.log(status);
return res.view({userStatus: status});
});
}
注意使用findOne
代替find
;find
将返回一个数组
另一种选择是从服务函数返回一个承诺,并将控制器代码与.then()
和.fail()
链接:
module.exports = {
getUserStatus: function(userId, cb){
return User.findOne().where({userId: userId});
}
}
index: function(req, res) {
userService.getUserStatus(req.session.User.id)
.then(function(user) {
console.log(user.status);
return res.view({userStatus: user.status});
})
.fail(function(err) {
return res.serverError(err);
});
});
}
这是一个偏好问题,但我认为第一种方法更好,特别是在您的情况下,因为它允许服务调用只交付status
,而不是整个用户对象。一般来说,习惯Node中的标准(err, result)
回调方法将对您很有帮助。