REStful API承诺调用另一个承诺

时间:2017-07-22 16:22:02

标签: javascript node.js mongodb promise

我正在使用promises重构我的代码。我遇到了一个问题。我有两条API路线。第一个是api.js,第二个是account.js。我还有4个控制器(CommentController,ZoneController,ProfileController,AccountController)。

CommentController,ZoneController和ProfileController共享相同的API路由(api.js)。

account.js使用AccountController。但AccountController的方法使用ProfileController的方法。

我最终让Promise调用另一个Promise,但我没有正确地返回数据。它将服务器挂起。当一个Promise调用另一个Promise时,如何返回数据? 基本上,account.js调用的AccountController.js有一个调用ProfileController.js的方法,但AccountController和ProfileController都被重构为Promise。我没有收到数据。请帮忙。

AccountController.js

var ProfileController = require('./ProfileController');

module.exports = {

  currentUser: function(req) {
    return new Promise(function(resolve, reject) {
      if (req.session == null) {
        reject({message: 'User not logged in'});
        return;
      }

      if (req.session.user == null) {
        reject({message: 'User not logged in'});
        return;
      }

      ProfileController.findById(req.session.user, function(err, result) {
        if (err) {
          reject({message: 'fail'});
          return;
        }
        resolve(result);
        return;
      });
    });
  }

ProfileController.js

  findById: function(id) {
    return new Promise(function(resolve, reject){
      Profile.findById(id, function(err, profile){
        if(err){
          reject(err);
          return;
        }
        resolve(profile);
        return;
      });
    })
  },

account.js 

router.get('/:action', function(req, res, next) {

  var action = req.params.action;

  if (action == 'logout') {
    req.session.reset();
    res.json({
      confirmation: 'success',
      message: 'Bye!'
    });
    return;
  }

  if (action == 'login') {
    res.json({
      confirmation: 'success',
      action: action
    });
    return;
  }

  if (action == 'currentuser') {
    AccountController.currentUser(req)
      .then(function(result){
        res.json({
          confirmation: 'success',
          user: result
        });
        return;
      })
      .catch(function(err){
        res.json({
          confirmation: 'fail',
          message: err.message
        });
        return;
      });

  }
});

1 个答案:

答案 0 :(得分:0)

您应该修改AccountController.js



AccountController.js

var ProfileController = require('./ProfileController');

module.exports = {

  currentUser: function(req) {
    return new Promise(function(resolve, reject) {
      if (req.session == null) {
        reject({message: 'User not logged in'});
        return;
      }

      if (req.session.user == null) {
        reject({message: 'User not logged in'});
        return;
      }

      ProfileController.findById(req.session.user).then(
      function (profile){
        resolve(profile);
      },function (err) {
        reject(err);
      });
  }