Подтвердить что ты не робот

Получение экспресс-сервера для принятия запроса CORS

У меня есть мой экспресс-сервер, работающий на http://localhost:3000 (я называю этот веб-сервер) У меня есть другое приложение, работающее на localhost: 8100 (я называю это просто "приложением" )

Когда мое приложение совершает звонок на веб-сервер, я получаю сообщение:

"XMLHTTPReqeust cannot load http://localhost:3000/auth/facebook. Response to preflight request doesn't pass access control check. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' when the credentials flag is true. Origin 'http://localhost:81000' is therefore not allowed acecss"

Это сообщение появляется в консоли браузера.

Я установил следующие параметры в промежуточном программном обеспечении моего веб-сервера node

res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT, POST,DELETE');

После прочтения нескольких вопросов stackoverfow я также добавил следующее:

 res.header('Access-Control-Allow-Origin', 'http://localhost:8100');

однако это не решает проблему.

4b9b3361

Ответ 1

Я лично предпочитаю cors модуль. Код очень прост:

var whitelist = [
    'http://0.0.0.0:3000',
];
var corsOptions = {
    origin: function(origin, callback){
        var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
        callback(null, originIsWhitelisted);
    },
    credentials: true
};
app.use(cors(corsOptions));

Ответ 2

Вам также необходимо разрешить метод OPTIONS в заголовке.

У меня есть это промежуточное ПО для cors:

module.exports = function (req, res, next) {
    // CORS headers
    res.header("Access-Control-Allow-Origin", "YOUR_URL"); // restrict it to the required domain
    res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
    // Set custom headers for CORS
    res.header("Access-Control-Allow-Headers", "Content-type,Accept,X-Custom-Header");

    if (req.method === "OPTIONS") {
        return res.status(200).end();
    }

    return next();
};

PS. Ошибка, которую вы получаете, связана с тем, как работает запрос кросс-происхождения. Короче говоря, браузер может сначала отправить запрос pre-flight с помощью метода OPTIONS, чтобы получить разрешенные источники, заголовки и методы. Поэтому для этого запроса вы должны возвращать только заголовки Access-Control-*. Если pre-flight прошел нормально, браузер продолжит исходный запрос.

Вы можете найти дополнительную информацию здесь.

Ответ 3

Я использую cors и реализую его так, это очень просто

var cors=require('cors');

app.use(cors({origin:true,credentials: true}));

Ответ 4

По-видимому, модуль cors не работал.

Используя приведенные выше подсказки, я использовал следующий код:

  if (req.method === "OPTIONS") {
    res.header('Access-Control-Allow-Origin', req.headers.origin);
  } else {
    res.header('Access-Control-Allow-Origin', '*');
  }

Это сделало трюк.

Ответ 5

Получилась та же проблема и наткнулась около часа, решение было фактически простым, просто включите CORS для предполетных операций

app.options('*', cors()); // include before other routes