Примечание: обновлено 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)
Я буду продолжать предоставлять обновления, пока работаю над решением этой проблемы.