Какой метод на Heroku используется для передачи вызовов Angular на внутренний API-интерфейс? - PullRequest
0 голосов
/ 10 мая 2019

Примечание: обновлено 2019 июнь 04; см. ниже

Это не вопрос определенного фрагмента кода; скорее, я ищу помощь в правильной архитектуре прокси-сервера для клиента Angular, взаимодействующего с внутренним API с помощью стека MEAN (MongoDB, Express, Angular, Node). Я программист на C старой школы, который самоучка себя значит. Старая собака, новый трюк. Я удалил несколько ресурсов, включая Переполнение стека, но не нашел ответа. Несколько пользователей Stack Overflow сообщают об одной и той же проблеме (я перечислил их в разделе SOURCES). У меня также есть справочный билет с Heroku.

Спасибо всем, кто читает и считает это. Дополнительная благодарность (заранее) всем, кто публикует полезные предложения и решения.

ВОПРОС: Как правильно спроектировать вызовы клиента Angular к внутреннему API, чтобы избежать проблем, присущих CORS (Cross-Origin Resource Sharing)? Решение, которое я создал и разработал из документации Angular, прокси-серверов, работает при работе в моей системе разработки (то есть на localhost), но при загрузке в мой PaaS (Heroku) происходит сбой. Это потому, что прокси-серверы Angular являются инструментом только для разработки? Если да, то каков правильный метод для вызова внутреннего API?

КОНФИГУРАЦИЯ: Я работаю на ОС Darwin (macOS 10.14.4), используя Node 10.13.0, npm 6.9.0, Express 4.16.2 и Angular 7.2.9. Я использую репозиторий git в Bitbucket, который направляет развертывание в Heroku. У меня есть отдельные развертывания для клиента (Angular) и API (Node / Express). Прямо сейчас клиент работает на Hobby Dyno и API на Free Dyno на Heroku. Моя база данных размещена на mLab в Песочнице (бесплатная база данных). Клиент: https://www.markwilx.com API: http://markwilx -api.herokuapp.com / api / test

ОБСУЖДЕНИЕ. Следующий вопрос в переполнении стека - та же проблема, с которой я столкнулся: Угловой proxy.conf.json для вызова API работает локально, но не в Heroku Решение не дано, но Массимилиано Сарторетто комментирует: «Этот прокси должен работать только для сервера разработки. Это не имеет никакого отношения к Heroku, и его даже не следует размещать на Heroku. Его цель - помочь вам прокси-вызовы внешнего API при обслуживании приложения с локального хоста ». У меня проблема с этим комментарием. Официальная документация Angular (см. ИСТОЧНИКИ ниже) не упоминает об этом. Я не оспариваю претензии г-на Сарторетто, но я, безусловно, утверждаю, что его претензии не известны и не документированы. Если кто-то знает об этом факте, я буду признателен за ссылку, где я могу прочитать об этом.

Точно так же г-н Ченки, который использует тот же метод, не упоминает об этом в своей книге (см. ИСТОЧНИКИ ниже). За несколько месяцев я несколько раз пытался спросить мистера Ченки через его веб-сайт, но он не ответил. Когда / если он это сделает, я обновлю этот пост.

Хорошая команда в Heroku ответила на мой билет помощи. Heroku не предоставляет возможности собственного прокси, поэтому любой прокси должен обрабатываться в клиенте Angular. Они склонны полагать, что проблема лежит где-то в претензии г-на Сарторетто. Описание того, как мне следует разрабатывать свой клиент и API, конечно, выходит за рамки их обслуживания.

Наконец, я нашел следующее в переполнении стека Прокси-сервер с Node.js на Heroku Это опять та же проблема, что и у меня. Человек, задающий вопрос, Андреа Регинато, не использует Angular, но он опубликовал свой обходной путь для Node. Мне интересно, является ли это предпочтительным методом, и мне просто нужно перенести его в Angular.

Я действительно застрял и хочу убедиться, что я строю свою систему с использованием лучших отраслевых методов.

ИСТОЧНИКИ: Официальная документация Angular по настройке прокси для внутреннего сервера приведена по этой ссылке: https://angular.io/guide/build#proxying-to-a-backend-server

Я читаю и подписываюсьg «Защита угловых приложений» Райана Ченки.Начиная со страниц 41, он начинает процесс демонстрации того, как создать прокси для своего приложения-примера.Его пример согласуется с методами в вышеприведенной документации Angular.

Вот неразрешенные запросы по переполнению стека, которые тесно связаны с моей проблемой:

[Мне пришлось удалить всеих.Stack Overflow решила, что мой пост был спамом.Я поместил самые важные из них в тексте выше.]


Обновление: 2019 июнь 04

Я продолжаю исследовать эту проблему с небольшим успехом.Хотя я не нашел ничего, кроме комментария Массимилиано Сарторетто о том, что прокси предназначены только для серверов разработки, я удалил прокси и пытаюсь обратиться к внешнему API другими способами.

В настоящее время я настроилПолитики безопасности контента для совместного использования ресурсов между источниками, и я использую Express для перенаправления вызова API, используя следующий код:

    app.get('/api/test', function(req, res) {
      request.get({
        url: 'https://markwilx-api.herokuapp.com/api/test' 
      }, function(error, response, body) {
        if(!error && response.statusCode == 200) {
          res.send(body);
        }
      });
    });

Еще раз, это работает без проблем в моей среде разработки (внешний сервер, работающий на локальном хосте, и внутренний сервер, работающий на Heroku), но после загрузки в Heroku он завершается неудачно.

внешний сервер, работающий на Heroku, выдает следующие ошибки при вызове API:

Jun 04 05:08:02 markwilx heroku/router: at=info method=GET path="/api/test" host=www.markwilx.com request_id=2f789dad-7161-4269-bf92-64db8060eadd fwd="184.170.243.167" dyno=web.1 connect=0ms service=10ms status=500 bytes=404 protocol=https 
Jun 04 05:08:02 markwilx app/web.1: ReferenceError: request is not defined 
Jun 04 05:08:02 markwilx app/web.1:     at /app/server.js:35:3 
Jun 04 05:08:02 markwilx app/web.1:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
Jun 04 05:08:02 markwilx app/web.1:     at next (/app/node_modules/express/lib/router/route.js:137:13) 
Jun 04 05:08:02 markwilx app/web.1:     at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) 
Jun 04 05:08:02 markwilx app/web.1:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
Jun 04 05:08:02 markwilx app/web.1:     at /app/node_modules/express/lib/router/index.js:281:22 
Jun 04 05:08:02 markwilx app/web.1:     at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) 
Jun 04 05:08:02 markwilx app/web.1:     at next (/app/node_modules/express/lib/router/index.js:275:10) 
Jun 04 05:08:02 markwilx app/web.1:     at SendStream.error (/app/node_modules/serve-static/index.js:121:7) 
Jun 04 05:08:02 markwilx app/web.1:     at emitOne (events.js:116:13) 
Jun 04 05:08:07 markwilx heroku/router: at=info method=GET path="/api/test" host=www.markwilx.com request_id=99922c46-a529-4f7e-8190-670cedf3a33d fwd="184.170.243.167" dyno=web.1 connect=0ms service=5ms status=500 bytes=404 protocol=https 
Jun 04 05:08:07 markwilx app/web.1: ReferenceError: request is not defined 
Jun 04 05:08:07 markwilx app/web.1:     at /app/server.js:35:3 
Jun 04 05:08:07 markwilx app/web.1:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
Jun 04 05:08:07 markwilx app/web.1:     at next (/app/node_modules/express/lib/router/route.js:137:13) 
Jun 04 05:08:07 markwilx app/web.1:     at Route.dispatch (/app/node_modules/express/lib/router/route.js:112:3) 
Jun 04 05:08:07 markwilx app/web.1:     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5) 
Jun 04 05:08:07 markwilx app/web.1:     at /app/node_modules/express/lib/router/index.js:281:22 
Jun 04 05:08:07 markwilx app/web.1:     at Function.process_params (/app/node_modules/express/lib/router/index.js:335:12) 
Jun 04 05:08:07 markwilx app/web.1:     at next (/app/node_modules/express/lib/router/index.js:275:10) 
Jun 04 05:08:07 markwilx app/web.1:     at SendStream.error (/app/node_modules/serve-static/index.js:121:7) 
Jun 04 05:08:07 markwilx app/web.1:     at emitOne (events.js:116:13) 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...