什么是从快递/连接中间件“结束”请求的正确方法?

假设我有这样的中间件;

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

我需要在这里遵守什么样的规则?

  1. 我应该调用res.end()吗? (或res.redirect()做到这一点?)
  2. 我应该打电话给next()吗? (或者连接检测请求已经结束并且干净地退出?)
  3. 假设我应该调用next() ,我想这意味着可能正在接收对我的中间件的请求,这可能已经被链中较高的其他中间件结束了; 我如何保护自己免受这个?

  1. res.redirect()确实调用res.end()本身;
  2. 如果你的中间件不是终点,你应该调用next() 。 在生成redirect的情况下,它一个端点,不应该调用next() ,但是如果req.host === host ,则需要调用next()将请求上移到其他中间件/航线;
  3. 一个请求不会结束,一个响应会。 而当它结束时,它将结束中间件链,所以你不必担心它。