アプリケーションのフロントエンドで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");
});
バックエンドサーバーコードが403のOPTIONS要求に応答するのはなぜですか?代わりに200応答でサーバーがOPTIONS要求に応答するようにします。 403レスポンスの原因となるバックエンドコードが表示されていないので、あなたのコードでそのコードを修正する方法はわかりません。 – apsillers
別の言い方をすると、CORSヘッダーが何とか403応答を引き起こしていると思われるようですが、究極の事実は、403応答がCORS障害を引き起こしているということです。 OPTIONS要求を受け取ったときに403で応答しないようにサーバーコードを修正し、クライアント側のCORSエラーが消えます。 – apsillers
なぜあなたは ''Content-Type':" application/json "、'?あなたはGETリクエストをしています。タイプを記述する内容はありません。 – Quentin