2016-09-03 3 views
0

アプリケーションのフロントエンドでAngularでhttpリクエストを作成しようとすると、プリフライトリクエストでステータスコード403が取得されるため、リクエストを完了できません。バックエンドのNode.jsに既にアクセスを許可するためのヘッダーを設定していますが、GETリクエストまたはPOSTリクエストの両方でエラーが発生します。私はここでいくつかの答えを読んで、基本的にはヘッダーのAccess-Control-Allow-Originを*に設定すると言っていますが、それはうまくいきませんでした。ここでCORSを追加した後でも、httpリクエストでステータスコード403が引き続き表示されるのはなぜですか?

は私のフロントエンドである:

$http({ 
     method : "GET", 
     url : "http://localhost:8080/v1/get-mac", 
     headers: { 
      'Content-Type': "application/json", 
      'Authorization': "token" 
     } 
     }).then(function(response) { 
      this.machines = response.data; 
     }); 

そして、これは私がExpressにバックエンドで何をしたかである:

app.use(function(req, res, next){ 
    res.header('Access-Control-Allow-Origin', "*"); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 
    res.header('Access-Control-Allow-Methods', 'GET, POST'); 
    next(); 
}); 

私はChromeで得るエラーは次のとおりです。

OPTIONS http://localhost:8080/v1/get-mac 
    (anonymous function) @ angular.js:12011 
    sendReq @ angular.js:11776 
    serverRequest @ angular.js:11571 
    processQueue @ angular.js:16383 
    (anonymous function) @ angular.js:16399 
    $eval @ angular.js:17682 
    $digest @ angular.js:17495 
    $apply @ angular.js:17790 
    (anonymous function) @ angular.js:25890 
    defaultHandlerWrapper @ angular.js:3497 
    eventHandler @ angular.js:3485 
XMLHttpRequest cannot load http://localhost:8080/v1/get-mac  
    Response for preflight has invalid HTTP status code 403 

なぜそれが起こっていますか?すでに多くのことを試しましたが、レスポンスヘッダを設定しても動作しないのはなぜか分かりません。おかげ

は、ここに私のapp.jsです:

var server = require(__dirname + '/server.js')(); 

var app = server.app.express(); 

app.use(function(req, res, next){ 
    res.header('Access-Control-Allow-Origin', "*"); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); 
    res.header('Access-Control-Allow-Methods', 'GET, POST'); 
    next(); 
}); 

app.use(server.app.express.static(server.app.path.join(__dirname, 'views'))); 
app.use(server.app.morgan('dev')); 
app.engine('html', server.app.ejs.renderFile); 
app.set('view engine', 'ejs'); 
app.use(server.app.methodOverride()); 
app.use(server.app.bodyParser.urlencoded({ extended: false })); 
app.use(server.app.bodyParser.json()); 

server.router(app); 

return server.app.http.createServer(app).listen(process.env.PORT || 8080, function() { 
    console.log("Server is on, listening on: 8080"); 
}); 
+2

バックエンドサーバーコードが403のOPTIONS要求に応答するのはなぜですか?代わりに200応答でサーバーがOPTIONS要求に応答するようにします。 403レスポンスの原因となるバックエンドコードが表示されていないので、あなたのコードでそのコードを修正する方法はわかりません。 – apsillers

+2

別の言い方をすると、CORSヘッダーが何とか403応答を引き起こしていると思われるようですが、究極の事実は、403応答がCORS障害を引き起こしているということです。 OPTIONS要求を受け取ったときに403で応答しないようにサーバーコードを修正し、クライアント側のCORSエラーが消えます。 – apsillers

+2

なぜあなたは ''Content-Type':" application/json "、'?あなたはGETリクエストをしています。タイプを記述する内容はありません。 – Quentin

答えて

-1

サーバーは、OPTIONS要求に "200" 応答を送信する必要があります。 サーバーコードを次のように変更してください。

app.use(function(req, res, next){ 
    res.header('Access-Control-Allow-Origin', "*"); 
    res.header('Access-Control-Allow-Headers', 'Content-Type,  
               Authorization'); 
    res.header('Access-Control-Allow-Methods', 'GET, POST'); 
    if(req.method === 'OPTIONS'){ 
     return res.status(200) 
    } 
    next(); 
}); 
+1

要求元が現在のページの原点と異なる場合、どのようにしてターゲット原点を指定するのですか? OPのコードが 'example.com'のページにあり、' http:// localhost:8080/v1/get-mac'のリクエストを送る場合、あなたのターゲットは 'localhost:8080 '*どこか*。 – apsillers

+0

編集された答えを見てください。そしてLuizが得ているエラーはサーバーからではなく、ブラウザからのものです。ブラウザはCORS要求が通過することを許可しません。 – Kandhan

+0

あなたの編集に:これはOPのコードがすでに行っていることです。 CORSヘッダーは、クロスオリジン要求が送信されたときにブラウザによって自動的に追加されます。 – apsillers

関連する問題