TypeError: next is not a function

32,971

Solution 1

So I figured it out. It was a much smaller error than I thought. I had the parameters to the callback-function in my router.param-method in the wrong sequence. The next-keyword should be where id was. This code fixed the problem:

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

Solution 2

Not an answer but just wanted to say that it's so easy to find error like these if you use Promises instead of nested callbacks. An example of above code refactorized.

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

Share:
32,971
SudokuNinja
Author by

SudokuNinja

Updated on July 09, 2022

Comments

  • SudokuNinja
    SudokuNinja almost 2 years

    I'm running a Node.js-server and trying to test this Rest API that I made with Express. It's linked up to MongoDB using Mongoose.

    I'm testing the individual routes using Postman and I get an error when trying to send a PUT-request to this route:

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

    The error retrieved is this:

    events.js:141
          throw er; // Unhandled 'error' event
          ^
    
    TypeError: next is not a function
    

    I cannot figure out where exactly this is coming from. I'm using the router.params-method to specify how the :id-parameter should be handled like this:

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