Express JS: заголовок "Access-Control-Allow-Origin" отсутствует на запрошенном ресурсе

У меня есть API, работающий на сервере, и клиентский интерфейс, подключающийся к нему для извлечения данных. Я провел некоторое исследование проблемы кросс-домена и работал. Однако я не уверен, что изменилось. Теперь я получаю эту ошибку в консоли:

XMLHttpRequest не может загрузить https://api.mydomain/api/status. нет Заголовок заголовка Access-Control-Allow-Origin присутствует в запрошенном ресурс. Происхождение http://beta.mydomain.com 'поэтому не допускается доступ. В ответе был код состояния HTTP 502.

У меня есть следующий файл маршрута:

var express = require('express');
var router = express.Router();
var Assessment = require('../app/models/assessment');

router.all('*', function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
});


router.post('/api/status', function (req, res, next) {
    getStatus.getStatus(req, res, Assessment);
});

module.exports = router;

И следующий JavaScript делает вызов Ajax на этот маршрут:

var user = {
    'uid' : '12345'
};
$.ajax({
    data: user,
    method: 'POST',
    url: 'https://api.mydomain/api/status',
    crossDomain: true,
    done: function () {
    },
    success: function (data) {
        console.log(JSON.stringify(data));
    },
    error: function (xhr, status) {

    }
});

Я пробовал: Помещение запрашивающего домена в заголовок "Access-Control-Allow-Origin" Использование модуля cors для выражения Помещение моей функции router.all внутри промежуточного ПО

Запросом домена является HTTP и домен api находится на HTTPS. Тем не менее, я работал, пока HTTP был включен.

Есть ли у кого-нибудь представление о том, почему заголовок "Access-Control-Allow-Origin" не отправляется?

Спасибо

Ответ 1

Вместо того, чтобы устанавливать заголовки запроса на ваш экспресс-маршрут, можете ли вы попытаться настроить его таким образом, чтобы выразить экземпляр таким образом,

var express = require('express');
var app = express();
var Assessment = require('../app/models/assessment');

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.post('/api/status', function (req, res, next) {
    // your code goes here
});

module.exports = app;

Надеюсь, это поможет!

Ответ 2

Вы также можете использовать cors npm для того же самого.

**npm i cors**

const cors = require('cors')

var corsOptions = {
  origin: '*',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 
}
app.use(cors(corsOptions));

var routes = require('./api/routes/route'); //importing route
routes(app); //register the route