#node.js #express #cors
Вопрос:
Я пытаюсь протестировать CORS на своем простом веб-сервисе.
var express = require('express')
var cors = require('cors')
var app = express()
var corsOptions = {
origin: 'http://example.com',
optionsSuccessStatus: 200
}
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({ msg: 'This is CORS-enabled for only example.com.' })
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
В терминале chrome с помощью команды fetch я хочу вызвать свою службу :
fetch("http://localhost/products/1", { credentials: 'include', headers: {
'Content-Type': 'application/json', 'Access-Control-Allow-Origin': 'http://example.com'
},}).then(req => req.text()).then(console.log)
но я получил ошибку:
search:1 Access to fetch at 'http://localhost/products/1' from origin 'https://www.google.com' 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. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
VM331:1 GET http://localhost/products/1 net::ERR_FAILED
Я добавил Access-Control-Allow-Origin
в свой запрос, но это не работает!
Комментарии:
1. Укажите порт? На каких портах работает ваше приложение?
http://localhost:3000/products
2. @Dharmaraj Я опубликовал ответ, он добавил example.com в происхождении, что не сработает
3. запуск через порт 80
app.listen(80,
@Dharmaraj4. Попробуй
fetch("http://localhost:80/products/1")
. Также, как упоминал @SachinAnanthakumar, какой домен вы установили вcors()
промежуточном программном обеспечении? Если вы просто поделитесь какой-то воображаемой конфигурацией, то ее будет трудно решить.5. Это полный код с попыткой pasteboard.co/Kj1shmS.png @Дхармарадж
Ответ №1:
Проверьте различные случаи, которые я упомянул ниже, Ваш вопрос подпадает под СЛУЧАЙ 1, Если в случае, если вы пытаетесь сделать запрос с веб-сайта на местном или производственном уровне, вы можете сослаться на другие случаи.
СЛУЧАЙ 1
Если вы планируете делать запросы только с вкладок, лучше всего установить свойство origin внутри corsOption на«*», как это.
происхождение: «*»
СЛУЧАЙ 2
Если вы хотите отправить запрос на сервер из приложения, запущенного на вашем локальном хосте, добавьте «http://localhost:(порт интерфейсного приложения)» в свойство origin
происхождение: «http://localhost:<website_port>»
СЛУЧАЙ 3
Если ваше интерфейсное приложение развернуто где-то, домен этого веб-сайта должен быть добавлен в свойство origin следующим образом
происхождение: «www.mywebsite.com»
СЛУЧАЙ 4
Нескольким веб-сайтам необходимо использовать API, а затем добавить массив доменов в свойство origin следующим образом
происхождение: [‘домен1’, ‘домен2’, …]
var express = require('express')
var cors = require('cors')
var app = express()
var corsOptions = {
origin: 'http://localhost:<the port>', //? can be a array of domains too
optionsSuccessStatus: 200
}
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({ msg: 'This is CORS-enabled for only example.com.' })
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Комментарии:
1. Я меняю на
origin: 'http://localhost:80',
, но все равно получаю ошибку: pasteboard.co/Kj1p6yE.png @Сачинанантакумар2. в каком порту запущено ваше интерфейсное приложение?
3. @Дхармарадж, я думаю, тогда ему нужно установить google.com как происхождение,
4. Зависит от того, какой домен открыт на этой вкладке браузера.
5. @Dharmaraj Если его единственная цель-сделать запрос с терминала, то ему нужно сделать origin для * или удалить corsOption.
Ответ №2:
Если вам нужно внести в белый список localhost только при разработке, вы можете попробовать следующее:
const corsOptions = {
origin: process.env.NODE_ENV === 'DEVELOPMENT' ? true : /https:.*?.?domain.com/,
}
В производстве это позволит использовать только ваш домен и поддомены.
Указанному вами домену corsOptions
будет разрешено отправлять запросы на ваш сервер. В вашем случае вы используете терминал браузера, и, следовательно, домен, на котором вы находитесь, будет принят за исходный. Поскольку у вас открыт Google, вы должны установить это в своем corOptions
:
const corsOptions = {
origin: 'https://google.com',
optionsSuccessStatus: 200
}
Также укажите порт, на котором работает ваше приложение express:
Access to fetch at 'http://localhost/products/1' from origin 'https://www.google.com' has been blocked by CORS policy
URL-адрес должен быть http://localhost:80/products/1
в этом случае.
Если вы будете использовать терминал браузера для тестирования, я бы рекомендовал установить значение origin равным true, что позволит выполнять запросы из любого источника:
const corsOption = {
origin: true
}
Если у вас нет веб-приложения и вам просто нужно протестировать API, рассмотрите возможность использования API-клиентов, таких как Postman или Insomnia. Вы можете прочитать больше о конфигурации CORS в документации.