使用水线查找方法有希望



当涉及到从包含数据库调用的方法返回响应时,我卡住了。

这是我需要的示例…

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)回调方法将对您很有帮助。

相关内容

  • 没有找到相关文章

最新更新