Разрешить запрос REST CORS на экспресс / узел.JS приложение на Heroku



Я написал REST API на экспресс-платформе для узла.js, который работает для запросов из консоли js в Chrome и URL-панели и т. д. Теперь я пытаюсь заставить его работать для запросов из другого приложения, на другом домене (ПДБС).



первый запрос, автоматически выполняемый интерфейсом javascript, - это /api / search?uri=, и, похоже, не удается выполнить запрос параметров" предполетный".



в моем экспресс-приложении я добавляю заголовки 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



метод запроса: параметры



код состояния: 200 OK



Заголовки Запроса



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?



спасибо.

750   3  

3 ответов:

Я проверил ваш код на чистом приложении ExpressJS, и он работает просто отлично.

попробуйте переместить app.use(allowCrossDomain) в верхней части функции настройки.

для поддержки cookies withCredentials вам нужна эта строка xhr.withCredentials = true;

mdn docs xhr.withCredentials

в экспресс-сервере добавьте этот блок перед всеми остальными

`app.all('*', function(req, res, next) {
     var origin = req.get('origin'); 
     res.header('Access-Control-Allow-Origin', origin);
     res.header("Access-Control-Allow-Headers", "X-Requested-With");
     res.header('Access-Control-Allow-Headers', 'Content-Type');
     next();
});`

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

оказывается, что JSON Web Token secret string не был определен в переменных среды, поэтому маркер не может быть подписан. Это вызвало к любому POST запрос, который полагается на проверку или подписание маркера, чтобы получить тайм-аут и вернуть 503 ошибка, сообщая браузеру, что что-то не так в CORS, что это не. Добавление переменной среды в Heroku решило проблему.

Я надеюсь, что это поможет кому-то.

Comments

    Ничего не найдено.