Heroku上将Angular调用代理到后端API的正确方法是什么?

时间:2019-05-10 09:54:47

标签: node.js angular heroku http-proxy

这不是关于特定代码段的问题;相反,我正在寻求帮助,以正确地为使用MEAN堆栈(MongoDB,Express,Angular,Node)与后端API通信的Angular客户端构建代理。我是一位老派的C程序员,自学MEAN。老狗,新把戏。我已经清理了一些资源,包括Stack Overflow,但是我没有找到答案。 Stack Overflow上的多个用户报告了相同的问题(我已在SOURCES下列出了这些问题)。我也有Heroku的帮助票。

感谢所有阅读并考虑到它的人。在此向所有发表有用建议和解决方案的人表示特别的感谢。

问题:如何正确设计Angular客户端对后端API的调用,以避免CORS(跨源资源共享)中固有的问题?我从Angular文档中提取并开发的解决方案代理可以在我的开发系统(即localhost)上运行时工作,但是当上传到我的PaaS(Heroku)时失败。这是因为Angular的代理服务器只是开发工具吗?如果是这样,调用后端API的正确方法是什么?

配置:我正在使用Node 10.13.0,npm 6.9.0,Express 4.16.2和Angular 7.2.9在Darwin OS(macOS 10.14.4)上进行开发。我在Bitbucket上使用了一个git存储库,该存储库将部署管道传输到Heroku。我为客户端(角度)和API(节点/快捷方式)分别进行了部署。现在,客户端在Heroku上以Hobby dyno运行,API在Free dyno上运行。我的数据库托管在沙箱中的mLab上(免费数据库)。 客户:https://www.markwilx.com API:http://markwilx-api.herokuapp.com/api/test

讨论:堆栈溢出中的以下问题与我遇到的问题相同: Angular proxy.conf.json to call API works locally but not on Heroku 没有给出任何解决方案,但Massimiliano Sartoretto发表评论指出: “该代理应该仅适用于开发服务器。它与Heroku无关,甚至不应该部署在Heroku上。其目标是帮助您从本地主机提供服务的同时代理外部API调用” 我对此评论有疑问。 Angular的官方文档(请参见下面的SOURCES)对此没有提及。我并没有对Sartoretto先生的主张提出异议,但我肯定断言他的主张并未广为人知或有据可查。如果有人知道这一事实,我将不胜感激。

同样,使用相同方法的Chenkie先生在他的书中也没有提到这一点(请参见下面的SOURCES)。我在过去几个月里曾多次尝试通过其网站向Chenkie先生询问,但他没有回应。当/如果他这样做,我将更新这篇文章。

Heroku的优秀团队对我的帮助单做出了回应。 Heroku不提供本机代理功能,因此任何代理都必须在Angular客户端中处理。他们倾向于认为问题出在萨托雷托先生的主张之内。当然,描述如何构建客户端和API的方法不在其服务范围之内。

最后,我在堆栈溢出中发现了以下内容 Proxy server with Node.js on Heroku 同样,这是我遇到的同样问题。提出问题的人Andrea Reginato没有使用Angular,但他发布了Node的解决方法。我想知道这是否是首选方法,我只需要将其移植到Angular中即可。

我真的很困惑,我想确保我使用行业最佳实践技术来构建系统。

资料来源:此链接提供了有关配置后端服务器代理的Angular官方文档: https://angular.io/guide/build#proxying-to-a-backend-server

我一直在阅读和关注Ryan Chenkie的“保护Angular应用程序”。从第41页开始,他正在演示如何为示例应用程序构建代理的过程。他的示例与上述Angular文档中的方法一致。

以下是关于堆栈溢出的未解决查询,这些查询与我遇到的问题密切相关:

[我不得不删除所有这些。包括它们在内,Stack Overflow决定我的帖子是垃圾邮件。我在上面的文字中提到了最重要的内容。]

2 个答案:

答案 0 :(得分:0)

我没有找到任何明确的答案,但是最佳实践似乎是使用CORS(跨源资源共享)。

Ryan Chenkie在他的《保护Angular应用程序》一书中,指导读者使用代理设置用户注册路线。他在第43页上说:“差异似乎并不那么重要,但这种差异带来了巨大的差异,使我们能够绕过跨域资源共享(CORS)之类的事情,也使我们可以更轻松地设置Cookie 。”

因此,我避免在尝试在Heroku上部署我的角度应用程序时使用CORS。但是,CORS似乎是构建API的行业标准。正如Massimiliano Sartoretto所称(见上文),代理似乎不适用于生产环境。我认为CORS并不是人们可以简单地“绕开”的东西,而是通过其他渠道学习到CORS的。

我多次尝试通过自己的网站联系页面与Chenkie先生取得联系,以了解他的做法。他从未回答。因此,当我说我对他的书感到非常失望时,他的那本关于保护角度应用程序(表面上用于部署它们)避免了Web应用程序中这个基本的安全性问题,我感到非常失望。我不知道他在书中可能还省略了哪些其他关键安全方面的内容;因此,我不推荐他的书。前往其他地方学习有关角度应用程序网络安全的信息。

以下是有关CORS的一些非常有用的解释:

请注意,飞行前请求(http OPTION)是学习Angular应用程序的重要方面。

npm中有一个有用的CORS软件包,您可以在这里找到: https://www.npmjs.com/package/cors

祝您编程愉快!

标记

答案 1 :(得分:0)

@MarkWilx的CORS方法也不起作用。我们的后端调用应该正确打到后端URL,例如https://backend-app.herokuapp.com/viewProduct。但是cors不会这样做。