Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why calling next() in express routes is optional?

In many examples of Nodejs/Express, I see that calling next() is optional in case of success.

 exports.postLogin = (req, res, next) => {
  passport.authenticate("local", (err, user, info) => {
    if (err) {
      return next(err);
    }
    req.logIn(user, err => {
      if (err) {
        return next(err);
      }
      req.flash("success", { msg: "Success! You are logged in." });
      res.redirect(req.session.returnTo || "/");
    });
  })(req, res, next);
};

Also, it is easy to skip callback next in the args:

exports.postLogin = (req, res) => {
   res.render('some-template', locals);
}

If I compare this with async lib or typical Javascript's asynchronous model, a missing callback will not give data or halt the process.

What does express do to take care of control flow when next is not called?

like image 972
ankitjaininfo Avatar asked May 29 '17 08:05

ankitjaininfo


2 Answers

The true callback in an Express middleware chain isn't actually next, as you might assume, but res.end(). Any request that is handled must, at some point, call this function (either directly or indirectly) to say that the request has been handled.

When you call next() in your middelware, you're passing on the responsibility of calling res.end() to the middleware further down the middleware chain. If the last middleware in the chain calls next(), then Express knows that no middleware has or will handle the request, and so a "404 Not Found" page will be generated.


Also, calling next(err) with a single argument err works differently, because it tells Express that an error occured and that it should instead by handled by the error handler.

like image 56
Frxstrem Avatar answered Sep 18 '22 12:09

Frxstrem


next is used to pass the request along to other (possible) handlers. If you're writing a middleware or (less likely) a route handler that doesn't want to handle the request, you call next and let Express sort it out. Perhaps there is other middleware, or another route handler, that can handle it.

If your code does handle the request, meaning that it sends back a response, you shouldn't call next. Express doesn't care about that: internally, middleware and route handlers are stored in an array, and Express checks each item to see if it can handle the request. It passes the next function so that it can be told to try the next matching handler. But it's optional.

It's also used to pass errors to Express, so it can pass them along the global error handler. That's what happens when you see next(err) being called.

like image 45
robertklep Avatar answered Sep 16 '22 12:09

robertklep