Проблема ExpresJS Cors: в ​​запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin»

Из того, что я исследовал, моя конфигурация должна быть в порядке и не иметь проблем с cors. Когда я делаю почтовый запрос, используя axios от localhost: 3000 до моего API на localhost: 8000, я вижу следующее сообщение об ошибке:

Access to XMLHttpRequest at 'http://localhost:8000/api/tags/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Итак, вот моя настройка конфигурации server.js:

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

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';

const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
    const server = express();

    server.use(function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Credentials", true);
        res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
        next();
    });

    server.use(bodyParser.json()); // support json encoded bodies
    server.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies

    server.use(cors({
        origin: '*',
        credentials: true,
    }));

    server.all('*', (req, res) => {
        return handle(req, res);
    });

    server.listen(port, (err) => {
        if (err) throw err;
        console.info(`> Ready on http://localhost:${port}`);
    });
});

В основном я пытаюсь сделать запрос из моего приложения next.js, которое находится на порту 3000, на мой сервер laravel/api на порту 8000. Может ли кто-нибудь увидеть мою проблему?

В вашем фрагменте кода вы используете порт 3000, но этот фрагмент выглядит для меня как сервер. Однако вы говорите, что ваш API находится на порту 8000. Не могли бы вы немного пояснить?

n9iels 26.03.2019 21:46

Вы указали OPTIONS в качестве допустимого метода запроса, но неправильно настроили свой сервер для обработки запросов OPTIONS. Отправляемый вами запрос требует предварительной проверки? Кроме того, если вы используете ПО промежуточного слоя cors, вам не нужно устанавливать заголовки самостоятельно. Промежуточное ПО cors сделает это за вас, вам просто нужно настроить его с помощью параметров.

Kevin B 26.03.2019 21:49

хорошо, мой экспресс-сервер js находится на порту 3000, и у меня есть сервер laravel, запущенный на порту 8000.

strangeQuirks 26.03.2019 21:49

а вы делаете запрос от 3000 до 8000, да?

Kevin B 26.03.2019 21:51

Похоже, вы настраиваете CORS не на том сервере.

Kevin B 26.03.2019 21:51

Исправьте Кевен Б, от 3000 до 8000. Какой будет правильная конфигурация? Вот где я потерялся.

strangeQuirks 26.03.2019 21:51

Вы настроили его, используя как setHeader, так и промежуточное ПО cors, выберите одно или другое. Первый неправильно обрабатывает запросы OPTIONS, и вы не можете использовать «*» для запросов с учетными данными, а со вторым у вас все еще есть проблема с «*». но ни одна из этих вещей не вызовет ошибку, которую вы видите, потому что ошибка исходит от запроса к laravel, а не к node.js.

Kevin B 26.03.2019 21:54
Стоит ли изучать 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
7
668
1

Ответы 1

Вы немного неправильно поняли концепцию заголовков CORS. Эти заголовки должны быть указаны на стороне сервера, вы устанавливаете их на стороне клиента (NodeJs).

Поэтому, если вы установите заголовки в приложении Laravel в вашем случае, все должно быть в порядке. Я не в Laravel, но я уверен, что есть встроенная функция или пакет, который сделает это за вас. Советую еще немного почитать про CORS, https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

Я вижу, тогда я был совершенно неправ, я думал, что из-за заголовков состояния проблемы моему приложению nodejs необходимо установить правильные заголовки, чтобы разрешить ему доступ к моему laravel API. Я вернусь и научусь :)

strangeQuirks 26.03.2019 21:57

Итак, в основном мой сервер nodejs может отправлять любые заголовки, которые он хочет, верно? но приложение laravel нужно настроить для приема запроса nodejs @n9iels?

strangeQuirks 26.03.2019 21:59

Да, вот так. Если быть немного точнее, приложение Laravel сообщает вашему браузеру, что разрешено выполнять к нему запрос с указанными заголовками.

n9iels 26.03.2019 22:04

ааа ладно тогда я был совершенно не на том пути. Спасибо!

strangeQuirks 26.03.2019 22:05

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