ReactiveSearch, ES и CORS

Я планирую использовать сервис AWS ES для размещения моего Elasticsearch. Я настраиваю прокси, как описано здесь, например так в экспресс-сервере.

var proxy = require('express-http-proxy');
...
app.use('/', index);
app.use('/users', users);
app.use('/search', proxy('localhost:9200'));

И это работает. Настройка прокси была довольно простой и понятной. И это то, что ReactiveSearch рекомендует при использовании AWS ES. Я могу перейти к localhost:5000/search и увидеть, что ES запущен и работает (отображает приветственное сообщение по умолчанию).

Однако, когда я запускаю интерфейс React (create-react-app) и пытаюсь отправить запрос, я получаю эту ошибку

Failed to load http://localhost:9200/query-index/_msearch?: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.

Я считаю, что у меня есть правильные настройки для ReactiveSearch для локального сервера ES в моем компоненте React:

<ReactiveBase
              app="query-index"
              url="http://localhost:9200"
              >

Где индекс запроса — это мой индекс ES, а URL — локальный сервер ES.

У меня есть эти настройки CORS для локального экземпляра ES

http.cors.enabled: true
http.cors.allow-credentials: true
# http.cors.allow-origin: "http://localhost:3000"
# http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/
http.cors.allow-origin: /https?:\/\/(localhost)?(127.0.0.1)?(:[0-9]+)?/
# #http.cors.allow.origin: "*" # this does not work with ReactiveBase
# #http.cors.allow-origin: /https?:\/\/(www.)?elastic.co/
# http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: X-Requested-With, Content-Type, Content-Length, Authorization, Accept

И тогда я считаю, что у меня есть правильная настройка параметров CORS для моего сервера Express.

var cors = require('cors');
...
var corsOptions = {
  origin: 'http://localhost:9200',
  optionsSuccessStatus: 200
};
...
app.options('/search', cors()); //should enable pre-flight for search routes
app.use('/search', cors(corsOptions), function(req, res, next) {
  res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Length, Content-Type, Authorization, Accept');
  res.header('Access-Control-Allow-Credentials', 'true');
  next();
});

Что я делаю неправильно, когда дело доходит до настроек CORS. Это настройка маршрута CORS или настройки CORS ES?

Я планирую использовать AWS ES для производства, но я просто хочу сначала провести локальное тестирование и, похоже, не могу правильно настроить CORS для React и ReactiveSearch.


person user3125823    schedule 14.08.2018    source источник


Ответы (1)


Похоже, что в конфигурации ES cors вы используете https с локальным хостом, что может создавать ошибку

http.cors.allow-origin: /https?://(localhost)?(127.0.0.1)?(:[0-9]+)?/

Также в вашей конфигурации cors для экспресс-приложения localhost:3000 для внешнего интерфейса? Если это так, вы вносите внешний интерфейс в белый список, что может быть не так.

Вы можете просто использовать app.use(cors()) перед объявлением любого маршрута, а затем использовать прокси для маршрута поиска, как указано здесь, с небольшим изменением:

app.use('/search', proxy(options));

https://github.com/appbaseio-apps/reactivesearch-proxy-server/blob/master/index.js#L46

person lakhansamani    schedule 14.11.2019
comment
Хороший материал, я на самом деле задал этот вопрос, когда впервые начал работать с ReactiveSearch, и с тех пор подписался на службу хостинга Appbase ES, потому что оказалось, что они проделали МНОГО тяжелой работы с конфигурацией и всем остальным. Пока очень доволен ReactiveSearch и Appbase. - person user3125823; 05.12.2019