Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Heroku上代理后端API的角度调用的正确方法是什么?_Node.js_Angular_Express_Heroku_Http Proxy - Fatal编程技术网

Node.js Heroku上代理后端API的角度调用的正确方法是什么?

Node.js Heroku上代理后端API的角度调用的正确方法是什么?,node.js,angular,express,heroku,http-proxy,Node.js,Angular,Express,Heroku,Http Proxy,注:更新日期:2019年6月4日;见下文 这不是关于特定代码片段的问题;相反,我正在寻求帮助,为使用MEAN堆栈(MongoDB、Express、Angular、Node)与后端API通信的Angular客户端正确地构建代理。我是一个老派的C程序员,自学成才。老狗,新把戏。我已经清理了几个资源,包括堆栈溢出,但我还没有找到答案。堆栈溢出上的几个用户报告了相同的问题(我在“源”下列出了这些问题)。我还有一张Heroku的帮助票 感谢每一位读到这篇文章并思考它的人。(提前)向所有发表有用建议和解决方

注:更新日期:2019年6月4日;见下文

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

感谢每一位读到这篇文章并思考它的人。(提前)向所有发表有用建议和解决方案的人表示额外的感谢

问题:您如何正确地构建Angular客户端对后端API的调用,以避免CORS(跨源资源共享)中固有的问题?我从Angular文档(代理)中绘制和开发的解决方案在我的开发系统(即localhost)上运行时有效,但在上传到我的PaaS(Heroku)时失败。这是因为Angular的代理仅用于开发吗?如果是,调用后端API的正确方法是什么

配置:我在DarwinOS(macOS 10.14.4)上开发,使用Node 10.13.0、npm 6.9.0、Express 4.16.2和Angular 7.2.9。我在Bitbucket上使用git存储库,它将部署管道化到Heroku。我为客户端(Angular)和API(Node/Express)进行了单独的部署。现在,客户端运行在Hobby dyno上,API运行在Heroku上的免费dyno上。我的数据库托管在沙箱(免费数据库)中的mLab上。 客户: API:

讨论:堆栈溢出中的以下问题与我遇到的问题相同: 没有给出解决方案,但马西米利亚诺·萨托雷托发表评论说: “该代理应该只适用于开发服务器。它与Heroku无关,甚至不应该部署在Heroku上。它的目标是帮助您代理外部API调用,同时从localhost为应用程序提供服务” 我对这个评论有意见。官方的角度文件(见下面的资料来源)没有提到这一点。我不是在质疑萨托雷托先生的主张,但我肯定地说,他的主张既没有广为人知,也没有记录在案。如果有人知道这一事实,我希望能有一个我可以阅读的参考资料

同样,使用同样方法的陈基先生在他的书中也没有提到这一点(见下文资料来源)。几个月来,我曾多次尝试通过陈基的网站询问他,但他没有回应。如果他这样做了,我会更新这篇文章

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

最后,我在堆栈溢出上发现了以下内容 这也是我面临的问题。问这个问题的人Andrea Reginato没有使用Angular,但他将自己的工作发布到了Node上。我想知道这是否是首选方法,我只需要将其移植到Angular中

我真的被卡住了,我想确保用行业最佳实践技术构建我的系统

来源:有关将代理配置到后端服务器的官方文档,请参见以下链接:

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

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

[我必须删除所有内容。包括这些内容后,Stack Overflow决定我的帖子是垃圾邮件。我将最重要的内容放在上面的文本中。]


更新:2019年6月4日

我继续研究这个问题,但收效甚微。尽管除了Massimiliano Sartoretto指出代理仅用于开发服务器的评论外,我没有发现任何其他内容,但我已经删除了代理,并试图通过其他方式解决外部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);
        }
      });
    });
同样,这在我的开发环境(运行在localhost上的前端服务器和运行在Heroku上的后端服务器)上可以无缝地工作,但一旦上传到Heroku就会失败

调用API时,在Heroku上运行的前端服务器会出现以下错误:

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) 

在解决此问题的过程中,我将继续提供更新。

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

Ryan Chenkie在他的书《保护角度应用程序》中指导读者使用代理设置用户注册路径。在第43页,他说,“这种差异似乎并不重要,但这种差异使世界变得不同,使我们能够绕过诸如跨来源资源共享(CORS)之类的事情,也使我们能够更轻松地设置cookies。”

因此,在Heroku上部署angular应用程序时,我避免使用CORS。然而,CORS似乎是构建API的行业标准。代理似乎不像Massimiliano Sartoretto(见上文)所说的那样适用于生产环境。我决定CORS不是一个可以简单地“四处走动”并通过其他渠道学习CORS的东西<