Различные порты для frontend и backend. Как сделать запрос?

использование Angular-CLI в качестве интерфейса. Порт 4200

использование Express в качестве бэкэнда. Порт 8080

каталоги выглядят так:

Application
 - backend
   - ...Express architecture
 - frontend
   -...Angular2 architecture

Итак, я запускаю два проекта, два командира, один для frontent, второй для backend. node app.js для бэкэнда (8080), ng serve для frontent (4200).

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

app.get('/hello', function(req, res) {
  res.send("Hello!");
}

как я могу сделать запрос от frontend к backend и вам эта струна? Я не хочу знать, как именно я должен использовать Angular2, потому что это не важно. Я спрашиваю, какую технологию я должен использовать, чтобы иметь возможность соединять эти две (переднюю и заднюю) стороны на разных портах. Если я просто запустил их и сделал запрос от frontend, я получу ошибку, потому что он не может найти /hello URL-адрес.

1 ответов


запрос /hello означает абсолютный путь внутри приложения, выполняющего угловое приложение, поэтому запрос переходит в http://localhost:4200/hello. Ваше угловое приложение просто не знает о экспресс-приложении, которое вы хотите настроить.

абсолютные urls

если вы хотите получить доступ к hello маршрут в другом (экспресс) приложении вам нужно явно указать это, сославшись на http://localhost:8080/hello.

cors

делая это таким образом, правильное приложение предназначено, но вы, скорее всего, столкнетесь с проблемами CORS, потому что браузер предотвратит код javascript, полученный из localhost:4200 для доступа к серверу в localhost:8080. Это функция безопасности Вашего браузера. Поэтому, если вы хотите разрешить коду в 4200 доступ к бэкэнду в 8080, ваш бэкэнд может белый список этого так называемого происхождения. Подробнее см.http://enable-cors.org/ и соответствующее промежуточное ПО express, которое можно использовать для поддержки cors в вашем бэкэнде (https://www.npmjs.com/package/cors).

используя этот подход имеет два недостатка на мой взгляд. Во-первых, вам нужен способ сообщить вашему интерфейсу, под каким абсолютным url он может достичь бэкэнда. Это должно быть настраиваемым, потому что вам нужны разные URL-адреса для разработки, подготовки и производства. Затем вам также понадобится способ управления всеми URL-адресами в белом списке, потому что интерфейс в производстве будет иметь другой url-адрес, чем при запуске интерфейса в разработке. Это может получить довольно громоздко обращаться.

прокси-сервера

лучший подход, на мой взгляд, чтобы справиться с этим в вашей инфраструктуре proxying бэкэнд в frontend приложения. При проксировании вы в основном говорите своему интерфейсному серверу, что все запросы к некоторому url должны быть переданы другому приложению. В вашем случае это может означать, что, например, вы настраиваете прокси-сервер для пути /api/ прокси приложения на localhost:8080. Сервер затем не пытается найти url-адрес, например /api/hello на вашем интерфейсном приложении, но перенаправляет ваш запрос на localhost:8080/hello. В вашем угловом приложении вам не нужно заботиться о url-адресе вашего бэкэнда, и вы всегда можете сделать запрос на url-адрес, например /api/some-express-route.

для этого вам нужно настроить сервер angular dev для прокси-запросов. Подробнее о том, как это сделать, см. В документах по адресуhttps://github.com/angular/angular-cli#proxy-to-backend. При переходе к производству вы можете сделать это, настроив свой веб-сервер, например nginx для прокси-запросов.