NodeJS TypeError:next不是函数

beq87vna  于 2023-03-17  发布在  Node.js
关注(0)|答案(3)|浏览(215)

我正在运行一个Node.js-server,并尝试测试这个Rest API,它是用Mongoose链接到MongoDB的。
我正在使用Postman测试各个路由,当尝试向此路由发送PUT请求时,我收到一个错误:

// PUT /meetings/:id
// Route for editing a specific meeting
router.put("/:id", function(req, res, next) {
    req.meeting.update(req.date, function(err, result) {
      if(err) return next(err);
      res.json(result);
    });
});

检索到的错误如下:

events.js:141
      throw er; // Unhandled 'error' event
      ^

TypeError: next is not a function

我不知道这是从哪里来的,我使用router.params-method来指定:id参数应该如何处理,如下所示:

router.param("id", function(req, res, id, next) {
  Meeting.findById(id, function(err, meeting) {
    if (err) return next(err);
    if (!meeting) {
      err = new Error("Meeting not found");
      err.status = 404;
      return next(err);
    }
    req.meeting = meeting;
    return next();
  });
});
7z5jn7bk

7z5jn7bk1#

所以我想明白了。这个错误比我想象的要小得多。我的router.param-method中的callback-function的参数顺序不对。next-keyword应该是id所在的位置。下面的代码修复了这个问题:

router.param("id", function(req, res, next, id) {
  Meeting.findById(id, function(err, meeting) {
    if (err) return next(err);
    if (!meeting) {
      err = new Error("Meeting not found");
      err.status = 404;
      return next(err);
    }
    req.meeting = meeting;
    return next();
  });
});
bgibtngc

bgibtngc2#

这不是答案,只是想说,如果你使用Promises而不是嵌套的回调函数,那么很容易发现这样的错误。

router.param("id", (req, res, id) => {
  Meeting.findById(id)
    .then(meeting => { meeting })
    .catch(err => res.status(404).send("Meeting not found"))
});
j2datikz

j2datikz3#

在Node-Js应用程序中,只需删除与给予此错误的路由相关的集合,就可以清除此错误。
在我的情况下,它的工作,谢谢你。

相关问题