Я написал REST API на платформе express для node.js, который работает для запросов из консоли js в Chrome, адресной строки и т. Д. Теперь я пытаюсь заставить его работать для запросов из другого приложения в другом домен (CORS).
Первый запрос, автоматически сделанный клиентским интерфейсом javascript, направлен на / api / search? Uri = и, похоже, не работает в запросе OPTIONS "предпечатной проверки".
В моем экспресс-приложении я добавляю заголовки CORS, используя:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.send(200);
}
else {
next();
}
};
и:
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(allowCrossDomain);
app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
С консоли Chrome я получаю эти заголовки:
URL-адрес запроса: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1
Метод запроса: OPTIONS
Код состояния: 200 ОК
Заголовки запроса
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
Параметры строки запроса
uri:http://localhost:5000/collections/1/documents/1
Заголовки ответа
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express
Похоже ли это на отсутствие правильных заголовков, отправляемых приложением API?
Спасибо.
OPTIONS
метода. Может ли кто-нибудь помочь мне понять, почему не обрабатывать толькоPOST
метод вместо обработки обоихPOST
иOPTIONS
метода?PATCH
если вы будете использовать его вместоPUT
обновления ресурсаОтветы:
Я проверил ваш код в чистом приложении ExpressJS, и он отлично работает.
Попробуйте переместить
app.use(allowCrossDomain)
в начало функции настройки.источник
app.use(app.router);
приветствия!для поддержки файлов cookie с учетными данными вам понадобится эта строка
xhr.withCredentials = true;
mdn docs xhr.withCredentials
В Express Server добавьте этот блок перед всеми другими
источник
Я добавляю это как ответ только потому, что исходный пост был добавлен в качестве комментария, и поэтому ваш покорный слуга упустил его из виду, когда я впервые просмотрел эту страницу.
Как отмечает @ConnorLeech в своем комментарии к принятому ответу выше, существует очень удобный пакет npm, называемый, что неудивительно, cors . Его использование так же просто, как
var cors = require('cors'); app.use(cors());
(опять же, заимствовано из ответа г-на Лича), а также может применяться более строгим и настраиваемым образом, как указано в их документах .Также стоит отметить, что исходный комментарий, на который я ссылаюсь выше, был сделан в 2014 году. Сейчас 2019 год, и, глядя на страницу пакета npm на github, репо было обновлено совсем недавно, девять дней назад.
источник
Это могло быть не так для большинства людей, просматривающих этот вопрос, но у меня была точно такая же проблема, и решение не было связано с
CORS
.Оказывается, секрет JSON Web Token
string
не был определен в переменных среды, поэтому токен не мог быть подписан. Это приводило к тому, что любойPOST
запрос, основанный на проверке или подписании токена, получал тайм-аут и возвращал503
ошибку, сообщая браузеру, что что-то не такCORS
, а это не так. Добавление переменной окружения в Heroku решило проблему.Я надеюсь, что это поможет кому-то.
источник
app.use(cors());
.Выполните следующие шаги:
Внутри вашего корневого js файла:
источник