Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the correct way to "end" a request from express/connect middleware?

Tags:

Assuming I have middleware such as this;

var express = require('express'); var app = express();  app.use(function (req, res, next) {     var host = "example.com";      if (req.host !== host) {         res.redirect(301, host + req.originalUrl);         res.end();     } }); 

What sort of rules do I need to abide by here?

  1. Should I be calling res.end()? (or does res.redirect() do this for me?)
  2. Should I be calling next()? (or does connect detect the request has ended and exit cleanly?)
  3. Assuming that I should be calling next(), I guess that means I can potentially be receiving requests to my middleware which may have already been ended by other middleware higher in the chain; how do I protect myself against this?
like image 233
Isaac Avatar asked Mar 22 '13 13:03

Isaac


People also ask

How do I stop request in middleware?

end() itself; You should call next() if your middleware isn't the end point; in the case of generating a redirect, it is an endpoint and next() shouldn't be called, but if req.

How do Middlewares work in Express?

Middleware literally means anything you put in the middle of one layer of the software and another. Express middleware are functions that execute during the lifecycle of a request to the Express server. Each middleware has access to the HTTP request and response for each route (or path) it's attached to.

What does the Express JSON () middleware do?

json() is a built-in middleware function in Express. This method is used to parse the incoming requests with JSON payloads and is based upon the bodyparser. This method returns the middleware that only parses JSON and only looks at the requests where the content-type header matches the type option.

Which middleware are used by an Express application?

Express has the following built-in middleware functions: express.static serves static assets such as HTML files, images, and so on. express.json parses incoming requests with JSON payloads. NOTE: Available with Express 4.16.0+


1 Answers

  1. res.redirect() indeed calls res.end() itself;
  2. You should call next() if your middleware isn't the end point; in the case of generating a redirect, it is an endpoint and next() shouldn't be called, but if req.host === host, you need to call next() to move the request up the chain to other middleware/routes;
  3. A request doesn't get ended, a response does. And when it does, it will end the middleware chain so you don't have to worry about it.
like image 102
robertklep Avatar answered Sep 27 '22 20:09

robertklep