Не удается отправить json на экспресс-сервер из браузера

Я установил 2 сервера: первый для фронтенда (localhost:7200), второй для бэкенда (localhost:7300). И есть тестовый запрос от фронтенда к бэкенду, соответственно, по маршруту '/test'.

Проблема в том, что когда я отправляю объект json (при нажатии кнопки «btn»), он отклоняется со следующим сообщением:

Access to XMLHttpRequest at 'http://localhost:7300/test' from origin 'http://localhost:7200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Конечно, я установил заголовок «Access-Control-Allow-Origin» на серверной части (см. ниже).

Это происходит, если я устанавливаю заголовок «Content-Type» как «application/json». Но он отлично работает, если заголовок вообще не установлен или заголовок имеет вид «application/x-www-form-urlencoded» (и, следовательно, отправляемое сообщение не похоже на JSON).

Код на фронтенде

btn.addEventListener('click', () => {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://localhost:7300/test', true);
    xhr.setRequestHeader('Accept', 'application/json');
    xhr.setRequestHeader('Content-Type', 'application/json');

    xhr.addEventListener('load', (e) => {
      console.info(e.target.responseText);
    });

    xhr.send(JSON.stringify({name: 'kek'}))
});

Код на бэкенде:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json());

app.post('/test', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Headers', 'Content-Type')
  // res.set('Content-Type', 'application/json');
  res.header("Content-Type",'application/json');
  console.info(req.body)
  res.json({success: true});
});
expressjs.com/en/resources/middleware/cors.html
Jota.Toledo 27.02.2019 10:45

Теперь это работает, спасибо! Но знаете ли вы, почему это не работает, если заголовки устанавливаются вручную?

SkyFlame 27.02.2019 10:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
1 259
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать промежуточное ПО cors. https://expressjs.com/en/resources/middleware/cors.html

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

Это промежуточное ПО автоматически устанавливает заголовки, чтобы избежать проблем с CORS (https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).

Спасибо. Я отметил другой ответ как решение, но эта статья мне тоже помогла. я проголосовал за твой ответ

SkyFlame 27.02.2019 12:43
Ответ принят как подходящий

Вы устанавливаете заголовки, когда ваш сервер отвечает на запрос POST.

app.post('/test', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.set('Access-Control-Allow-Headers', 'Content-Type')

В сообщении об ошибке говорится:

Response to preflight request doesn't pass access control check

Предпечатный запрос — это запрос OPTIONS, а не запрос POST, поэтому заголовки в ответе на него не устанавливаются, и запрос POST никогда не выполняется.


Используйте стандартная cors библиотека промежуточного программного обеспечения. Не изобретайте велосипед.

Другие вопросы по теме