2015-09-03 55 views
1

我正在處理一個在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(); 
}); 

然而,這產生了同樣的錯誤(「沒有‘訪問控制允許來源’標頭出現在所請求的資源」)像之前一樣。

+1

這就是'app.use()'用於安裝一箇中間件處理程序,它可以查看/修改所有請求。 – jfriend00

+0

我有一種感覺,我很接近,但我註冊的中間件似乎沒有做任何事情(請參閱編輯我的問題);我添加了一些調試輸出以查看它何時執行,但它從未在控制檯中彈出。我對[內置中間件中的「setHeaders」選項](http://expressjs.com/guide/using-middleware.html#middleware.built-in)感到樂觀,但它僅適用於靜態資源,而我找不到相應的第三方處理......其他所有內容。 –

+1

看起來你可能還得設置'Access-Control-Allow-Headers'。請參閱http://jonathanmh.com/how-to-enable-cors-in-express-js-node-js/ – jfriend00

回答

1

可以使用。用做一個普通的中間件()或者可以使用NPM包,比如express-interceptor也攔截響應

+0

Gah,我討厭把這個標記爲答案,但是我意識到一旦我批准了這個我忘記重啓服務器的人。我在上面添加了我的代碼片段,以便您可以看到添加的內容,但實際上並沒有工作。 –

1

試試這個作爲一箇中間件:

app.use(function(req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization'); 
    next(); 
}); 
0

我只是跑進同樣的問題,並嘗試以上相同的片段。它做了詭計。

// allow CORS: 
app.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8000'); 
    next(); 
}); 

我不得不確保把它放在高於一切其他app.use(XYZ)項,就像@rev_bird提到他與該CORS模塊。嘗試一下。

相關問題