Разрешить CORS REST-запрос к приложению Express / Node.js на Heroku

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

Первый запрос, автоматически выполняемый интерфейсом javascript, относится к / api / search? Uri = и, по-видимому, завершается с ошибкой в & quot; preflight & quot; ВАРИАНТЫ запроса.

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

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

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?

Благодарю.

 Danny23 янв. 2019 г., 17:39
Могу также хотеть включитьPATCH если вы будете использовать его вместоPUT обновить ресурс
 Ulysses Alves20 июн. 2016 г., 15:50
Я получаю эту ошибку в коде, который я не написал, но я не понимаю необходимости обработчика дляOPTIONS метод. Может кто-нибудь, пожалуйста, помогите мне понять, почему не обрабатывать толькоPOST метод вместо обработки обоихPOST and OPTIONS метод?

Ответы на вопрос(3)

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

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

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

 02 апр. 2018 г., 22:22
Я добавлю, что любое невыполненное обещание приведет к этой вводящей в заблуждение ошибке! Я должен был четко указать, какая версия Node используется, иначе мои вызовы из базы данных (mongo) просто зависали, и единственное, что браузер мог сказать мне, это 503, а затем некоторые глупости, связанные с Cors. Эта ошибка действительно смутила меня дольше всехapp.use(cors()); собирается.
 27 нояб. 2017 г., 23:20
@alan Я использовал обещания для проверки токена в моем приложении, например, если секрет JWT не определен, обещание никогда не разрешится, вотcode Я использовал, если вам нужна дополнительная ссылка.
 27 нояб. 2017 г., 23:24
Спасибо за ответ. Я посмотрю код. По секрету я предполагаю, что вы говорите о втором секретном ключе. Я использую oauth2.
 27 нояб. 2017 г., 19:06
Да, это была проблема со мной. Не могли бы вы конкретизировать, как вы решили проблему. Я все еще в разработке и работаю над пакетом Express.js с узлом cors.
Решение Вопроса

и он работает просто отлично.

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

 28 янв. 2015 г., 20:30
@ConnorLeech Очень мило. Я делал подход allowCrossDomain, как описано выше, и устал от работы со всеми этими заголовочными файлами. Кроме того - поскольку нам нужен только CORS для dev, не было никакого смысла посвящать так много циклов выяснению того, что происходит. Рад, что есть поддержка node.js, позволяющая легко это сделать.
 22 нояб. 2012 г., 18:03
В моем случае, следующий вызов POST не вызывается после отправки res.send (200), когда req.method == 'OPTIONS'. я что-то пропустил?
 19 нояб. 2017 г., 18:25
@ConnorLeech Я думаю, что вы должны добавить свой комментарий в качестве ответа ... работает как удовольствие, и это приятно и просто
 19 авг. 2012 г., 16:34
Причина в том, что вам нужно определить это доapp.use(app.router); Ура!
 04 нояб. 2014 г., 20:51
var cors = require('cors'); app.use(cors()); также работает

xhr.withCredentials = true;

MDN документы XHr.WithCredentials

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

`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();
});`

Ваш ответ на вопрос