Вы правильно понимаете, что проблема связана с CORS.
Ваша ошибка: Access-Control-Allow-Headers не допускается типом содержимого поля заголовка запроса в предпечатном ответе .
В некоторых случаях клиент отправляет «предварительный запрос» на сервер.Когда?
Например, когда ваш тип контента "сложный".Комплекс означает не в application/x-www-form-urlencoded
, multipart/form-data
или text/plain
.
Или когда вы отправляете запрос POST с телом.
Есть и другие случаи, вы можете прочитать большеоб этом в MDN .
Предварительный запрос - это просто запрос с методом "OPTIONS", который отправляется в ту же самую конечную точку.Он ожидает получить обратно
успешный ответ
, который разрешает все заголовки
и позволяетисточник.
Ваше промежуточное программное обеспечение Express app.use((req,res,next) => {...
соответствует требованиям 2 и 3. (На самом деле для 3 я бы рекомендовал установить заголовок «Access-Control-Allow-Origin» на http://localhost:4200
вместо localhost
)
Но у вас нет промежуточного программного обеспечения или обработчика маршрутов для обработки запроса OPTIONS.Давайте добавим один:
Если мы получим запрос OPTIONS, мы вернем 200 OK.Если это не запрос OPTIONS, перейдите к следующему обработчику.
app.use((req, res) => {
if (req.method === 'OPTIONS') {
return res.sendStatus(200);
}
next();
});
Поскольку мы хотим, чтобы ответ OPTIONS на ALSO также устанавливал правильные заголовки, мы должны включить его после в «cors middleware»:
app.use((req,res,next) => {
// set cors headers and call next()
});
app.use((req, res, next) => {
// handle preflight requests
});
app.post('api/heroes', ...)
Наконец, есть, конечно, готовые решения для этого, например, пакет cors
на npm , который предоставляет промежуточное программное обеспечение для express .Проверьте, как использовать его на странице npm .