TypeError:next不是函数

时间:2017-03-19 13:05:24

标签: javascript node.js mongodb express mongoose

我正在运行Node.js服务器,并尝试测试我使用Express制作的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-parameter:

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();
  });
});

2 个答案:

答案 0 :(得分:2)

所以我明白了。这是一个比我想象的小得多的错误。我在router.param-method中以错误的顺序使用了回调函数的参数。 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();
  });
});

答案 1 :(得分:2)

不是答案,只是想说如果使用Promises而不是嵌套回调,就很容易找到这样的错误。上面代码重构的一个例子。

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