2017-07-06 72 views
0

我在教導自己的web開發人員,並且只是將XMLHttpRequests從面向客戶端的頁面發送到Express.js API後端。在這種情況下,我使用它來傳輸表單數據並將其保存到Mongo數據庫。在不使用CORS的情況下訪問您的後端API

我遇到的具體問題是:我發送的編碼爲application/json,由於Express.js API在http://127.0.0.1:3000上運行,這會引發一個跨源錯誤。我瞭解,對同一個域但不同端口的請求會導致此錯誤。

我已經能夠做npm install cors,然後在我的Express.js源使用var cors = require('cors');app.use(cors());繞過它,但我的理解是,將在任何地方打開API高達請求。如果我真的只希望它只能在我自己的域中訪問,該怎麼辦?我的意思是假設它是一個生產站點mysite.com,表單位於mysite.com/form,後端位於mysite.com:3000。我認爲我正在把這些例子的想法正確的,但因爲我是新手,所以我不確定。

我怎樣才能讓他們在同一個域上運行,以避免跨域請求?有沒有一個標準的方法來做到這一點?到目前爲止,我想要獲得後端,並且在同一個端口上運行的表單需要從Express.js後端本身提供表單頁面,但如果我不希望Express作爲我的服務器呢?如果我想用Apache或其他方式以某種其他方式提供頁面,並且只需要將此表單發送到Express進行處理?或者如果我想讓一個Angular應用程序將POST數據運行到Express後端,再次進行處理?

謝謝!

回答

2

如果你想堅持CORS,你可以配置它堅持一定的淵源:https://www.npmjs.com/package/cors#configuring-cors 但是請記住,這並不通過一個簡單的命令curl別人訪問你的API阻止。 CORS是爲了保護瀏覽器,而不是API。

一個更好的方法(你自己提到)應該是讓兩部分在同一個域和端口上運行。這可以通過代理請求來實現。在Express中,您只需以express.static()作爲靜態資產交付您的前端代碼即可。在Apache中,你也可以添加一些代理,儘管我不能幫你解決問題,因爲我不熟悉Apache模塊和設置。

保護您的API從第三方訪問是另一個話題。你需要一些形式的認證和授權。這樣做可能很困難。也許你應該看看Oauth 2爲一個成熟的標準。

+0

這樣:一個更好的方法(你自己提到過)應該是讓這兩個部分在同一個域和端口上運行。 – maaw

+0

「CORS是爲了保護瀏覽器,而不是API」 - 如果情況如此,那麼如何在事物的Express方面啓用CORS允許POST請求起作用?看起來Express API拒絕連接而不是瀏覽器。 – steelstring94

+0

通常,瀏覽器遵循相同的來源策略。在這裏你可以閱讀更多:https://en.wikipedia.org/wiki/Same-origin_policy通過使用CORS這個政策是禁用的某些域,允許跨源訪問。如果它確實執行請求,它仍然是瀏覽器的決定。服務器只是告訴它它是否「應該滿足請求」(https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS)因此,您的瀏覽器詢問「是我的域名保存訪問」,並且如果是這樣,它解釋結果。否則,它會通過拋出異常來停止。希望有幫助;-) – alex3683

相關問題