Ошибка CORS с NodeJS Express и ReactJS

Прежде всего, хочу сказать, что я прочитал около 12 подобных вопросов на StackOverflow, но ни один из них не помог мне решить мою проблему, и на большинство из них были довольно неясные ответы, поэтому я считаю, что этот вопрос стоит задать, также я только начинающий.

Окружающая обстановка:

У меня есть приложение для реагирования, работающее на localhost на порту 3000 и сервер Express на порту 8000. Мой сервер:

const express = require('express');
const app = express();

const port = 8000;

app.post('/register', (req, res) => {
    res.send(JSON.stringify({test: 'HELLO!'}));
});

const server = app.listen(port, () => console.info('Listening on port', server.address().port));

И клиент:

static register(username, password) {
    return fetch('http://localhost:8000/register', {
      method: 'POST',
      body: JSON.stringify({username, password}),
      headers: {'Content-Type': 'text/plain'}
    }).then(response => console.info(response));
  }

При отправке этого запроса я получил бы это сообщение об ошибке:

Failed to load http://localhost:8000/register: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

После некоторых исследований я попробовал несколько решений: Добавление этого промежуточного программного обеспечения перед «POST» на моем сервере:

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

  next();
});

Это не помогло, поэтому я попробовал пакет node КОРС, и все же это не решило мою проблему. Но что-то изменилось: вместо этого я больше не получал это сообщение об ошибке, я получал ответ в журнале, но вместо того, чтобы получать объект, который я отправил с сервера, я получал какой-то «объект ошибки»:

bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 200
statusText: "OK"
type: "cors"
url: "http://localhost:8000/register"

Но когда я открыл вкладку сети в Chrome, я увидел, что ответ был таким, как я ожидал {test: HELLO!}, поэтому Chrome что-то менял, поэтому я отключил безопасность Chrome, но он все равно регистрировал тот же объект ошибки. Итак, попробовав все это, я не смог заставить свой код работать, поэтому может ли кто-нибудь полностью ответить, как отправлять запросы из приложения React на экспресс-сервер без получения ошибки cors?

Полный код сервера:

const express = require('express');
const cors = require('cors');
const app = express();

const port = 8000;

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

  next();
});

app.post('/register', (req, res) => {
    res.send(JSON.stringify({test: 'HELLO!'}));
});

const server = app.listen(port, () => console.info('Listening on port', server.address().port));

Можете ли вы показать, как вы использовали промежуточное программное обеспечение cors?, потому что только с этой правильной настройкой вы не должны получить никаких ошибок, связанных с CORS. Этот маршрут, который у вас есть, в любом случае не является правильным способом установки CORS, обычно вы хотите завершить запрос после установки заголовков для метода OPTIONS.

Marcos Casagrande 04.04.2019 21:57

Я обновил, мой вопрос. Я уже получил ответ, но все же не могли бы вы объяснить, почему это неправильный способ установки CORS, я только начал учиться, так что это было бы очень полезно.

Misho Tek 04.04.2019 22:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 636
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что весь ваш запрос работает нормально, поэтому вы получили status: 200. Проблема в том, как вы передаете запрос в client. что должно быть

static register(username, password) {
    return fetch('http://localhost:8000/register', {
      method: 'POST',
      body: JSON.stringify({username, password}),
      headers: {'Content-Type': 'text/plain'}
    })
    .then(response => response.json())
    .then(json => console.info(json));
  }

Упомянутый вами «объект ошибки» — это всего лишь полный ответ, который содержит json, который вы действительно запросили, а также некоторые метаданные.

Вы абсолютно правы, у меня работает. Спасибо за Ваш ответ.

Misho Tek 04.04.2019 22:14

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