Я впервые использую cors и node.js. Я пытаюсь вызвать веб-API, размещенный на одном URL-адресе, с другого URL-адреса.
Я даже не могу заставить корс работать просто app.use(cors());
Я пробовал более сложные конфигурации с происхождением и всем остальным, но все равно безуспешно.
API живет на https://api.example.app и вызывается из https://myapp.example.app
Я получаю всевозможные ошибки Cors.
Обратите внимание: я также использую CloudFlare и Nginx Proxy Manager.
Кроме того, я МОГУ перейти на https://api.example.app/select и без проблем вернуть свои данные. Но это единственный работающий сценарий.
var express = require('express');
var mysql = require('mysql');
var cors = require('cors');
var app = express();
var port = 3333;
app.use(express.text());
app.use(cors());
var pool = mysql.createPool({
connectionLimit: 10,
host: '192.168.1.200',
port: 3306,
user: 'user',
password: 'password',
database: 'mydb'
});
app.get('/select', (req, res) => {
pool.query('SELECT * FROM mytable', (error, results, fields) => {
if (error) {
console.error('Error retrieving data:', error);
return res.status(500).send('Failed to retrieve data from database');
}
console.info('Data retrieved successfully:', results);
res.status(200).json(results);
});
});
app.post('/insert', (req, res) => {
var string = req.body;
console.info(req.body);
if (!string) {
return res.status(400).send('String is required');
}
pool.query('INSERT INTO mytable(user) VALUES (?)', string, (err, results) => {
if (err) {
console.error('Error inserting string into database:', err);
return res.status(500).send('Failed to insert string into database');
}
console.info('String inserted successfully');
return res.status(200).send('String inserted successfully');
});
});
app.listen(port, () => {
console.info(`Server is running on http://192.168.1.200:${port}`);
});
Добавлено по ссылке под кодом. @derpirscher
Как выглядит ваша конфигурация COR? Разрешаете ли вы все межсайтовые запросы? Разрешили ли вы происхождение вашего интерфейса?
@DanAshley — нет смысла указывать origin
в качестве заголовка FE, вы не можете это контролировать, он передается браузером и не может быть переопределен.
@RyanPierceWilliams поправьте меня, если я ошибаюсь, но разве моя конфигурация COR не просто 'app.use(cors());' который, насколько я знаю, просто позволяет выполнять любые межсайтовые действия?
Похоже, это проблема Cloudflare/nginx. Не похоже, что запрос доходит до вашего приложения — app.use(cors())
— включает CORS для всех.
@AdamJenkins Я удалил это сейчас, те же ошибки. Это было частью моего устранения неполадок.
@DanAshley - удаление ничего не исправит, я просто указал, что это лишнее (или, скорее, ненужное). Начните исследовать конфигурацию прокси-сервера nginx (я не уверен, что вы под этим подразумеваете), но похоже, что проблема не в вашем экспресс-приложении.
@AdamJenkins какие-нибудь настройки в CF или Nginx, которые мне стоит попробовать?? Буду рад присоединиться к Discord или чему-то еще для более быстрого устранения неполадок.
@DanAshley Я не знаком с настройкой правил CORS в CF, все, что я знаю, это то, что вашей проблемы нет в приведенном выше коде. Может, начать с документации?
@AdamJenkins Я установил расширение для обхода cors, теперь просто «ОТПУСКАЮ api.exmaple.app/insert 403 (Запрещено)»
@DanAshley - замечательно! Что-то еще выдает вам ошибку 403, вероятно, в CloudFlare. Очень часто можно увидеть эти ошибки CORS в консоли, которые на самом деле не являются ошибками CORS, как это и есть здесь. Это не проблема CORS, это (вероятно) проблема конфигурации Cloudflare.
@DanAshley - какой продукт ты используешь? Сотрудник ЦФ? Помогает ли это?
Я просто использую доменное имя CF для DNS. Непонятно, что такое рабочий.
@AdamJenkins Сейчас я проверяю некоторые шаги ChatGPT для CF и cors.
@DanAshley - это не ошибка CORS, это отвлекающий маневр. Где размещается ваш фактический рабочий код, если вы просто используете CF для DNS?
@DanAshley - я могу тебе это доказать. Если вы добавите журнал в начало своего маршрута insert
и выполните POST с включенным расширением CORS (чтобы вы не получили ошибку CORS) — вы увидите, что журнал никогда не выполняется. Это потому, что маршрут никогда не будет поврежден, потому что его блокирует что-то еще. Есть ли в вашем приложении какое-либо другое промежуточное программное обеспечение, которое вы не показываете?
То, что вы сделали, вы просто внедрили промежуточное программное обеспечение CORS, ничего не настраивая. Проверьте эту ссылку для получения более глубоких технических знаний.
Однако ниже приведен план конфигурации CORS, который вы можете изменить в соответствии со своими потребностями.
const express = require("express");
const app = express();
app.use(express.json());
// For CORS
app.use((req, res, next) => {
const allowedOrigins = [
'http://example1.com',
'https://example2.com',
'http://localhost:3016' // allow local development server
];
const origin = req.headers.origin;
// Check if the request origin is in the list of allowed origins
if (allowedOrigins.includes(origin)) {
res.header("Access-Control-Allow-Origin", origin); // replace with '*' to allow all
}
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); // replace with '*' to allow all
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); // replace with '*' to allow all
res.header("Access-Control-Allow-Credentials", "true");
next();
});
app.post("/api/v1/insert", async (req, res) => {
});
Здесь все верно, но это никак не решает (и даже не решает) проблему ОП. Конфигурация по умолчанию для «принудительного применения CORS без какой-либо настройки» — «разрешить каждый источник», поэтому она по-прежнему не решает проблему OP.
Попробовал это, все равно не помогло: / те же ошибки
просто сделать app.use(cors())
— это самый простой способ разрешить корс, поскольку он разрешает все....
@derpirscher это то, что я показываю в своем исходном посте
@DanAshley Мой комментарий был предназначен для BassamA, который предположил, что ручная настройка соответствующих заголовков Cors решит проблему, но это не так.
запрещенную проблему 403, которую я решил, добавив правило страницы Cloudflare в
https://myapp.exmaple.app/* Всегда используйте HTTPS.
Мне удалось вставить в БД со своей веб-страницы ТОЛЬКО сейчас, используя расширение Google Chrome «Разрешить CORS».
Обновлять. Я ДУМАЮ, что у меня получилось с помощью комбинации вышеперечисленных действий И отключения правила WAF только для испытаний США.
@AdamJenkins теперь только по вопросу CORS.
Я очень смущен, вы не можете использовать страницы Cloudflare для экспресс-сервера. Выше вы упомянули, что используете CF только для DNS. Как правило страницы Cloudflare влияет на CF DNS? Где находится ваш экспресс-сервер? Является ли опубликованный вами серверный код на 100% точным представлением вашего реального развернутого кода (т. е. есть ли у вас какое-либо другое промежуточное программное обеспечение)?
Я, конечно, не сетевой гений. так что, возможно, я ошибся в жаргоне. У меня есть веб-страница, размещенная на моем сервере unraid с использованием nginx, затем у меня есть доменное имя из CF, которое я проксирую с помощью прокси-менеджера nginx? ржу не могу
@AdamJenkins Я пробовал это. Я получаю это сегодня. Доступ к выборке «api.lucidnet.app/insert » из источника « multistreamer.lucidnet.app» заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: он не проходит иметь статус HTTP ok.
@AdamJenkins, он работал целый день или два, но не больше.
Прямо сейчас этот маршрут дает плохой шлюз в Cloudflare, а это означает, что ваш сервер не работает (может быть, он сломался?). Эти вопросы лучше всего понимать по отдельности. На данный момент это не проблема CORS, Cloudflare выдает ошибку 502. Запустите свой сервер и убедитесь, что Cloudflare решает ее правильно, а затем работайте над проблемой CORS (если она существует). И не используйте расширения браузера, чтобы «обойти эту проблему», они не решают ее, а только запутывают, в чем заключается реальная проблема.
Я думаю, что смогу вернуться к работе с комбинацией конфигураций Cloudflare, но, к сожалению, я не уверен, какие настройки помогают, а какие нет. Все, что я знаю, это то, что это работает. Поэтому я действительно не хочу публиковать ответ, если не смогу просто сказать это...
Я думаю, что смогу вернуться к работе с комбинацией конфигураций Cloudflare, но, к сожалению, я не уверен, какие настройки помогают, а какие нет. Все, что я знаю, это то, что это работает. Поэтому я действительно не хочу публиковать ответ, пока не смогу просто сказать это, но я хочу закрыть проблему...
Судя по моему тестированию, настройки Cloudflare не влияют на них через некоторое время, когда они работали через день после изменения настройки, но не на следующий. Возможно, дело в кэшировании.
Если кто-то хочет посмотреть мою конфигурацию CF на экране Discord, чтобы определить, что следует настраивать, а что нет. Я по-прежнему готов принять это, чтобы помочь прийти к четкому выводу. В противном случае это пыль на ветру.
Всем спасибо.
«Я получаю всевозможные ошибки Cors». пожалуйста, опубликуйте точные сообщения об ошибках из консоли браузера... Потому что серверный код, который вы показываете, в порядке.