Разрешить CORS для PUT в Node.js

Я пытаюсь сделать PUT вызов моей конечной точки api rest и получаю эту ошибку:

Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.

Я включил CORS, используя это решение: enable-cors, оно работает для POST.

Как мне добиться того же для PUT?

Благодарю.

Ответ 1

добавить это:

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

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");
       res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
          next();
    });

Ответ 2

Вам нужно будет поддерживать метод OPTIONS на вашем сервере, потому что браузер будет предварительно обрабатывать все запросы PUT между источниками независимо от того, какие у вас заголовки. И вам нужно убедиться, что вы явно разрешаете PUT в заголовках CORS. Об этом можно узнать на странице MDN в CORS:

Кроме того, для методов HTTP-запросов, которые могут вызывать побочные эффекты на данных сервера (в частности, для HTTP-методов, отличных от GET, или для использования POST с определенными типами MIME), спецификация предписывает браузерам "предварительно проверять" запрос, запрашивая поддерживаемые методы. с сервера с помощью метода запроса HTTP OPTIONS, а затем, после "одобрения" с сервера, отправляет фактический запрос с фактическим методом HTTP-запроса. Серверы также могут уведомлять клиентов о необходимости отправки "учетных данных" (включая файлы cookie и данные HTTP-аутентификации) с запросами.

Итак, на вашем сервере вам нужно сделать что-то вроде этого:

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    // allow preflight
    if (req.method === 'OPTIONS') {
        res.send(200);
    } else {
        next();
    }
});

Вот статья на тему:

Запросы перекрестного происхождения в Express.JS