类型错误:next 不是函数

Sud*_*nja 4 javascript mongoose mongodb node.js express

我正在运行 Node.js-server 并尝试测试我用 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);
    });
});
Run Code Online (Sandbox Code Playgroud)

检索到的错误是这样的:

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

TypeError: next is not a function
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚这究竟是从哪里来的。我正在使用 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();
  });
});
Run Code Online (Sandbox Code Playgroud)

Sud*_*nja 9

所以我想通了。这个错误比我想象的要小得多。我的 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();
  });
});
Run Code Online (Sandbox Code Playgroud)


Jam*_*mie 5

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

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