【问题标题】:TypeError: next is not a function类型错误:next 不是函数
【发布时间】:2017-08-10 17:55:56
【问题描述】:

我正在运行 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();
  });
});

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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();
        });
      });
      

      【讨论】:

        猜你喜欢
        • 2020-09-18
        • 2016-02-26
        • 2013-04-01
        • 2016-03-06
        • 2018-04-28
        • 2019-02-14
        • 2021-10-02
        • 2021-10-30
        相关资源
        最近更新 更多