我正在處理一個在MEAN堆棧上運行的小應用程序,並遇到了一個令人討厭的障礙:我的後端應用程序(節點Express)運行在http://localhost:3000
,運行良好,但我的前端客戶端應用程序(的Javascript AngularJS)運行在http://localhost:8000
,這意味着從角發送的請求被接受,並回答了,但一旦他們到達因爲他們解釋爲來自不同來源來被拒絕。在Express中設置默認響應標頭
我能以相對較少的戲劇解決這個問題,通過使我的「告訴我所有的東西」的方法是這個樣子:
exports.index = function(req, res) {
Region.find({}, function(err, docs) {
if(!err) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
res.json(200, { regions: docs });
} else {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
res.json(500, { message: err });
}
});
}
的res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
行是我加告訴了一個瀏覽器可以接受迴應並停止打擾我;現在的問題是,我有這個愚蠢行添加到這是一個從任何地方發送的每一個反應,我相信我一定是缺少一些辦法只有改變默認的頭永遠包括Access-Control-Allow-Origin
條目。
在一個完美的世界,我可以根據正在執行什麼樣的環境中的代碼和關閉翻蓋,但我在app.js會完全滿足於一個代碼塊,我至少可以刪除一次而不是試圖追蹤res.setHeader
的75個實例。我想一定有改變落後res
的.json
方法隱藏在它的基礎的方式,但該文檔不提供任何洞察我怎麼可能做到這一點,更何況它是否是一個可怕的想法。有什麼想法嗎?
編輯
我認爲(作爲建議)是configuring application-level middleware是關鍵。下面是我添加到我的app.js文件的代碼:
// allow CORS:
app.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000');
next();
});
然而,這產生了同樣的錯誤(「沒有‘訪問控制允許來源’標頭出現在所請求的資源」)像之前一樣。
這就是'app.use()'用於安裝一箇中間件處理程序,它可以查看/修改所有請求。 – jfriend00
我有一種感覺,我很接近,但我註冊的中間件似乎沒有做任何事情(請參閱編輯我的問題);我添加了一些調試輸出以查看它何時執行,但它從未在控制檯中彈出。我對[內置中間件中的「setHeaders」選項](http://expressjs.com/guide/using-middleware.html#middleware.built-in)感到樂觀,但它僅適用於靜態資源,而我找不到相應的第三方處理......其他所有內容。 –
看起來你可能還得設置'Access-Control-Allow-Headers'。請參閱http://jonathanmh.com/how-to-enable-cors-in-express-js-node-js/ – jfriend00