2013-01-05 30 views
33

我有幾個靜態頁面與Express.JS一起提供。設置是容易的:使用Express.JS發送額外的http標題

var app = express(); 

app.configure(function(){ 
    app.use(express.static(path.join(application_root, "StaticPages"))); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

我想要的響應於包括addittional HTTP報頭(訪問控制允許來源:*)。它應該放在哪裏? 我試過下面的示例,但當然,頭只出現默認的網頁上:

app.get('/', function(req, res){ 
    res.setHeader("Access-Control-Allow-Origin", "*"); 
    res.send('Hello World'); 
}); 

感謝。

+1

對於那些尋找如何設定路線上的自定義頁眉和'沒有定義res.setHeader',使用'res.set'或'res.header'。 http://expressjs.com/en/api.html#res.set – AndyPerlitch

回答

48

我嘗試了下面的示例,但當然,頭只出現默認頁面

是上,那是因爲你定義它只是爲GET /路線,不爲別的路徑。您應該使用中間件。

如果你想設置頁眉所有請求:

app.configure(function(){ 
    app.use(function(req, res, next) { 
    res.setHeader("Access-Control-Allow-Origin", "*"); 
    return next(); 
    }); 
    app.use(express.static(path.join(application_root, "StaticPages"))); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

如果你只是想這樣做的靜態文件夾,沒有通用的方法。您可以更改express.static(來自connect.static)。另一種方法是匹配url並在URL匹配時設置標題。

app.configure(function(){ 
    app.use(function(req, res, next) { 
    var matchUrl = '/StaticFolder'; 
    if(req.url.substring(0, matchUrl.length) === matchUrl) { 
     res.setHeader("Access-Control-Allow-Origin", "*"); 
    } 
    return next(); 
    }); 
    app.use(express.static(path.join(application_root, "StaticPages"))); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

注:中間件需要被路由,使生效,換句話說,你不能把中間件靜態中間件之後。

+0

它的工作原理,謝謝。我需要第一個案子。 – csg

+1

'setHeaders - 設置HTTP頭文件的功能。 - Function in static http://expressjs.com/en/4x/api.html#express.static – Green

+0

您可以添加一個處理程序_after_這個靜態中間件,它可以在沒有url substring匹配的情況下設置標頭,而不是使用'app。使用......更少的開銷 –

2

另一種方式:

app.use(express.static(
    path.join(application_root, "StaticPages"), 
    { 
     setHeaders: (res) => { 
      res.setHeader('Access-Control-Allow-Origin', '*') 
     } 
    } 
))