1. 程式人生 > 實用技巧 >node+express+vue專案部署到伺服器,Nginx設定跨域

node+express+vue專案部署到伺服器,Nginx設定跨域

要一個人寫前臺和後臺就是一把辛酸淚,跨域弄得我頭大,寫了一個node+express+vue的前後臺分離專案,部署到伺服器出現跨域問題,找了好多資料,終於解決這個心頭大患了,哈哈哈哈哈

一、打包前端及放到伺服器上面

我的前端是用Vue寫的,然後打包,把專案放到tomcat/webapps/ROOT/資料夾下面,我新建了一個資料夾來存放node寫的後臺程式碼,如下圖express存放的就是我的node程式碼

二、啟動後臺,前臺訪問

然後我啟動node,訪問前端IP時出現了跨域的問題,如下圖

原因:

  1.前端發出的請求附帶身份驗證(withCredentials: true),意思是是否支援傳送cookie憑證資訊的欄位,而後端的Access-Control-Allow-Origin

為 ‘*’時,請求會失敗,因為在options預請求的時候會被攔截下來,而在最開始,這兩者我都佔據了,所以寫下來,防止自己下次再犯相同的錯誤。

結果報了以下圖的錯誤,大概意思說

在預請求的時候失敗了,當請求證書的模式為‘include’時,Access-Control-Allow-Origin不能為‘*’,這個證書模式初始化是通過ajax的widthCredentials屬性控制的

  

找了好久的資料,終於解決了,請看我緩緩道來~

解決方法:

1. 方法一

前端請求頭的withCredentials設定為false

後端Access-Control-Allow-Origin可以設定為‘*’,不用進行身份過濾

2. 方法二

前臺的withCredentials:true或者後臺的Access-Control-Allow-Credentials設定為字串true時,Access-Control-Allow-Origin不可以設定為‘*’,要設定為我請求的域名即可

即在node專案的app.js檔案加入以下程式碼,就成功解決了跨域的問題

app.all('*',function(req,res,next){
      res.header("Access-Control-Allow-Credentials", 'true');
  res.header("Access-Control-Allow-Origin", req.headers.origin);
  res.header(
'Access-Control-Allow-Headers', 'Content-type, usernme, token'); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,PATCH"); res.header("X-Powered-By", ' 3.2.1') console.log(res.header().method,'res-----------------------------') //res.send(res.header()) // res.header("Content-Type", "application/json;charset=utf-8"); next(); })