首页 > 解决方案 > 尝试从猫鼬保存返回承诺时出错

问题描述

我正在使用mongooseexpressnode

我遇到了嵌套承诺的问题,无法弄清楚为什么会这样。

路线- /loans

router.post('/problems/add', (req, res, next) => {
// error checking
  req.headers.api = 'true';

  let required = ['loan', 'item', 'type', 'quantity', 'description'];
  let problems = [];

  required.forEach(r => {
    if (!req.body[r]){
      problems.push(`Field '${r}' was not supplied`);
    }
  });

  if (problems.length > 0){
    res.json({success: false, message: `Couldn't create problem:\n${problems.join('\n')}`});
  } else {

// Important part
    loanController.addProblem(req.body)
    .then((newProblem) => { // line 118 mentioned in error message
      res.json({success: true, problem: newProblem});
    })
    .catch(err => {
      return next(err);
    })
  }

});

控制器- 贷款控制器

exports.addProblem = (body) => {

  Loan.findById(mongoose.Types.ObjectId(body.loan)).exec()
  .then(foundLoan => {

    if (!foundLoan){
      throw new Error('loan not found');
    }

    let newProblem = new Problem({
      loan: foundLoan._id,
      item: mongoose.Types.ObjectId(body.item),
      type: body.type,
      quantity: body.quantity,
      status: 'new',
      text: body.description
    });

    return newProblem.save(); // newProblem is a valid mongoose document
  })
  .catch(err => {
    return Promise.reject(err);
  });

}

我收到以下错误,它没有被任何这些 catch 块捕获,并且来自我的一般错误捕获:

“TypeError:无法读取 router.post 处未定义的属性 'then' (c:\dev....\loans.js:118:5)

现在,当我在 处设置断点时newProblem.save(),它显示newProblem为有效的 Mongoose 文档,这些文档被正确保存。我什至可以newProblem.save().then()从调试命令行调用。

我假设我在某处犯了错误,但这与其他对象的结构相似,并且它们工作正常。

谁能发现我犯的错误或建议进一步调查的方法?

标签: javascriptnode.jsmongoosepromise

解决方案


推荐阅读