2013-03-22 29 views
13

假設我有中間件如此;「結束」express/connect中間件請求的正確方法是什麼?

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(),我想這意味着可能會被接收請求我的中間件可能已經被其他結束中間件鏈較高;我如何保護自己免受這種傷害?

回答

18
  1. res.redirect()確實調用res.end()本身;
  2. 你應該叫next()如果你的中間件是不是終點;在生成重定向的情況下,其端點和next()不應被調用,但如果是req.host === host,則需要調用next()將請求上移到其他中間件/路由;
  3. 的請求沒有得到端的響應呢。當它結束時,它會結束中間件鏈,所以你不必擔心它。
+1

需要注意的是,如果您有其他處理要做,您仍然可以調用next,但是請注意,您已發送響應,以便響應對象完成並且幾乎是後響應處理的變量。 要發送一個響應,然後做其他操作慢喜歡與其他服務器通信跟蹤統計或發送電子郵件,或推動事情到一個隊列或者跟一個數據庫或等,所以真的結束明示這是非常有用請求/響應鏈是當你不再調用中間件並且它被垃圾收集時。 – 2016-12-08 17:37:27

相關問題