2016-12-08 76 views
0

我已經看到了幾個關於這個問題和答案,我的工作是一半。請求的資源上不存在「Access-Control-Allow-Origin」標頭。

我有一個node.js api服務器與url api.domain.com和網站上的一個nginx服務器在www.domain.com當我做下面的角度請求通過在api服務器上,我看到請求我看到它被解析並放入數據庫。但是,在客戶端,我不馬上得到回報,然後最終我會看到No 'Access-Control-Allow-Origin' header is present on the requested resource.

我知道是什麼導致了這種行爲,但是不應該在錯誤發生之前將錯誤拋出API服務器?另請注意,node.js服務器已啓用cors。應該返回的響應是json。

$http({ 
      method: 'POST', 
      url: "http://api.domain.com/addtrans/" + $scope.accountID, 
      headers: { 
       'Access-Control-Allow-Origin': '*', 
       'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT', 
       'Content-Type': 'application/x-www-form-urlencoded' 
      }, 
      transformRequest: function (obj) { 
       var str = []; 
       for (var p in obj) 
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); 
       return str.join("&"); 
      }, 
      data: { 
       payload: JSON.stringify(trans) 
      } 
     }).success(function (result) { 
      $scope.trans = {}; 
      console.log(result); 
     }); 
+0

您使用的快遞與節點? – Yaser

+1

'Access-Control-Allow- *'是* response *頭,而不是請求頭。 –

+0

是的,我使用快遞。 –

回答

0

我已將以下中間件用於我們所有的項目,並且已被證明效果最佳。

const allowCors = (req, res, next) => { 

    /** Allow all origins, for now TODO */ 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Credentials', true); 
    res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type'); 
    res.header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE'); 

    /** Browser check for pre-flight request to determine whether the server is webdav compatible */ 
    if ('OPTIONS' == req.method) { 
     res.sendStatus(204); 
    } 
    else next(); 
}; 

// Put this code before the routes you want to allow CORS to 
app.use(allowCors); 

您應該將Allow-Origin更改爲受安全原因限制更多的東西。

上面的代碼涵蓋了CORS以及大多數瀏覽器的預發佈(這是我們在開始時遇到的一個主要問題)。

0

我用這一段時間以前(表示3.X):

// npm install --save cors 
var express = require('express'); 
var cors = require('cors'); 
var app = express(); 
app.use(cors()); 
app.use(express.static()); 
app.get('*', function(){}); 
require('http').createServer(app).listen(3000) 
0

記住CORS標頭應該是在其上從服務器不被從客戶端發送的請求來響應。

您可以使用中間件服務器上啓用CORS:

//CORS middleware 
var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', 'example.com'); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 

    next(); 
} 

//... 
app.configure(function() { 
    ... 
    app.use(allowCrossDomain); 
    ... 
}); 
相關問題