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

1

26

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?
Numidia answered 22/3, 2013 at 13:38 Comment(0)
U
36
  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.
Uvula answered 22/3, 2013 at 13:55 Comment(1)
Something to note is that if you have other processing to do you can still call next, however be mindful that you've sent a response so the response object is finished and pretty much a variable for post-response processing. This is useful where you want to send a response and THEN do other slower operations like communicating with other servers to track stats or send emails, or push things onto a queue or talk to a database or etc., so really ending an express request/response chain is when you don't call anymore middleware and it gets garbage collected.Gaddy

© 2022 - 2024 — McMap. All rights reserved.