接下来如何解决不是功能错误信息?

时间:2019-07-29 18:03:26

标签: node.js mean-stack

我正在尝试创建MEAN堆栈应用,目前正在使用UPDATE功能。

我的代码当前遇到此方法失败:

    businessRoutes.route('/update/:id').post(function (req, res) {
        Business.findById(req.params.id, function (err, business) {
    if (!business)
      return next(new Error('Could not load Document'));
    else {
      business.person_name = req.body.person_name;
      business.business_name = req.body.business_name;
      business.business_gst_number = req.body.business_gst_number;

      business.save().then(business => {
        res.json('Update complete');
        console.log('Update Complete');
      })
        .catch(err => {
          res.status(400).send("unable to update the database");
        });
    }
  });
});

控制台中显示的错误消息是:

  

TypeError:下一个不是函数

此行代码失败:

return next(new Error('Could not load Document'));

有人可以告诉我为什么会这样以及如何解决吗?

2 个答案:

答案 0 :(得分:2)

findById的第二个参数需要一个回调,该回调具有两个参数err<entity>。没有中间件或其他任何东西,您所谓的next(...)试图调用您找到的实体。

来自文档

Adventure.findById(id, function (err, adventure) {});

对于您来说,business始终是未定义的,而adventurenext从来都不是函数。

答案 1 :(得分:0)

这可能是您的意思:

问题在于,您要成为“下一个”的参数实际上来自express.js(这意味着它是在您运行的第一个函数回调中出现的(在.post(之后–该函数---您可以选择使用3个参数:

  • req用户对您的服务器的请求
  • res您准备发送的回复
  • next第3个参数是可选的,它允许您将其发送到下一个中​​间件,或者如果将其发送给参数,它将把它发送到错误处理程序,该错误处理程序将错误作为响应发送。

另一方面:

您将next参数随机放置在您试图调用的猫鼬函数的中间:猫鼬函数实际上只需要(错误,项目)...

businessRoutes.route('/update/:id').post(function (req, res, next) {
  // note that express exposes the "next" param
  // this is a callback indicating to run the `next` middleware 
  Business.findById(req.params.id, function (err, business, whoKnows) {
// note this is from mongoose.js: the callback function actually only has 2 parameters (err, and foundObject)

    if (!business)
      return next(new Error('Could not load Document'));
    else {
      business.person_name = req.body.person_name;
      business.business_name = req.body.business_name;
      business.business_gst_number = req.body.business_gst_number;

      business.save().then(business => {
        res.json('Update complete');
      })
        .catch(err => {
          res.status(400).send("unable to update the database");
        });
    }
  });
});

请注意,我建议您使用异步等待,这将使整个事情更容易理解:

businessRoutes.route('/update/:id').post(async (req, res, next) => {
try {
 const foundBusiness = await Business.findById(req.params.id)
//... do stuff
catch (e) {
next(throw new Error(e))
// .. other stuff
}
})