2014-03-05 85 views
2

我在angular.js APP和我的express.js REST之間進行通信時遇到問題。無法從angular.js發送POST到express.js

我使用yeoman 1.0和generator-angular 0.7.1。

我試圖爲我的grunt serve使用中間件配置,但我沒有得到它的工作。

角應用(端口:9000):

angular.module('wboxApp') 
    .controller('AdminCtrl', function ($scope, $routeParams, $http, fbRef) { 
    var ref = fbRef(); 
    var token = $routeParams.token; 

    $http.post('http://127.0.0.1:3000/box/token/get', {token: token}).success(function (data) { 
     console.log(data); 
     } 
    }); 
    }); 

快遞API(端口:3000):

app.post('/box/token/get', function (req, res) { 
    res.header('Access-Control-Allow-Origin', req.headers.origin || "*"); 
    res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'content-Type,x-requested-with'); 

    var token = req.body.token; 
    var tokenRef = ref.child('tokens').child(token); 

    tokenRef.once('value', function (data) { 
    var fullToken = data.val(); 

    fullToken = fullToken + '.' + token; 

    if (data.val()) { 
     res.json({fullToken: fullToken}); 
    } else { 
     res.json({fullToken: null}); 
    } 
    }); 
}); 

瀏覽器錯誤:

OPTIONS http://127.0.0.1:3000/box/token/get No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:9000' is therefore not allowed access. 
XMLHttpRequest cannot load http://127.0.0.1:3000/box/token/get. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:9000' is therefore not allowed access. 

回答

5

看來角頁面由運行在127.0.0.1:9000上的服務器提供服務。交叉來源策略不允許來自其他域的Ajax請求。爲了解決它可以添加快遞中間件,其中添加標頭交叉來源請求 -

app.all('/*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type,X-Requested-With'); 
    next(); 
}); 
+0

我還添加了'res.header( '訪問控制允許的方法', 'GET,POST,PUT,HEAD,DELETE,OPTIONS' );'現在它工作。 – cebor

+0

我不認爲你的情況是需要的。 'Access-Control-Allow-Methods'僅用於預檢查的請求。而你的是一個似乎沒有預衝的帖子請求。請求的內容類型是什麼? –

+0

'應用程序/ json',但我認爲angular.post需要'選項',而不會出現錯誤。 – cebor

0

哦,親愛的,不要執行交叉來源的請求!
還有一個更好的方法:grunt-connect-proxy - 向9000端口發出請求,並讓你的前端服務器將它們轉發到實際的後端。

這裏是如何在不到3分鐘對其進行配置:https://stackoverflow.com/a/21655532/1432478

+0

我只需要CORS的開發,所以我認爲編輯我的頭是更容易的解決方案。 – cebor

+0

@cebor COR更簡單嗎?我真的會進行問卷調查。此外,它不完全是瀏覽器不可知的,你必須對URL進行硬編碼。但是,如你所願 – vucalur