使用嵌套回调来表达中间件

时间:2015-01-09 12:59:56

标签: node.js mongodb express mongoose

在我的服务器控制器代码中,我有一个方法,它根据提供的id检索收入和费用对象。但代码存在问题,如果费用方法失败,则中间件的next()链断开。所做的基本上是在Income.findById的回调中附加Expense.findById部分。

可以避免这样的嵌套回调吗?请注意,在获取收入之前,expense._id是未知的。

 /**
     * Transfer middleware
     * Returns an income from id if the income has the 'isTransfer attribute set' and the corresponding expense
     */
    exports.transferByID = function(req, res, next, id) {
      var expense;

      Income.findById(id).populate('user', 'displayName').exec(function(err, income) {
            if (err) return next(err);
            if (! income) return next(new Error('Failed to load Income ' + id));
            if(income.isTransfer){
              Expense.findById(income.expense).populate('user', 'displayName').exec(function(err, expense) {
                if (err) return next(err);
                if (! expense) return next(new Error('Failed to load Expense ' + id));
                if(expense.isTransfer){
                    req.transfer = {income:income, expense:expense};
                    next();
                }
              });

            }else{
              req.transfer={};
              req.transfer.name = "The selected transaction is not a transfer" ;
            }

        //What happens if i get here?
        });
    };

澄清:如果收入成功且费用失败,我会在评论中结束,例如,如果费用没有得到isTransfer === true?。但是,如果我在评论中放下一个,那么下一个将在费用找到之前解雇。

0 个答案:

没有答案