Когда я пытаюсь сделать запрос HTTP в Angular в интерфейсе моего приложения, я не могу выполнить запрос, поскольку получаю код статуса 403 в запросе предполетной проверки. Я уже установил заголовки в Node.js в фоновом режиме, чтобы разрешить доступ, но я все еще получаю ошибку, как для запросов GET, так и для POST. Я также прочитал несколько ответов здесь, и они в основном говорят, чтобы установить заголовок Access-Control-Allow-Origin как *, но это не сработало.
Вот мой интерфейс:
$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");
});
Сервер должен отправить ответ "200" на запрос OPTIONS. Поэтому измените код сервера на:
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();
});
example.com
и вы хотите отправить запрос на http://localhost:8080/v1/get-mac
, то вам нужно указать, что ваша цель где-то localhost:8080
.