【问题标题】:Connect to particular API based on environment根据环境连接到特定的 API
【发布时间】:2016-03-11 06:50:43
【问题描述】:

我有一个与 NodeJS 后端对话的 AngularJS 应用程序。我最近刚刚在前端的 API 地址中进行了硬编码,因为只有一个环境(即我的开发环境与我的生产环境相同)。

但是,随着项目的扩展,我现在拥有三个环境:开发、登台和生产。

我的开发和暂存环境使用相同的 API(比如 dev.fooapi.com),但我的生产环境应该使用不同的 API(比如 prod.fooapi.com)。

我的问题是:在我的应用程序中,有哪些“优雅”(我把它放在引号中,因为谁来说明什么是优雅的,什么不是)?我目前在我的源文件中有一个字符串占位符,看起来像“API_PLACEHOLDER”和一个 Grunt 任务,它在我的代码库中与该字符串匹配的任何地方执行字符串替换。显然这并不理想,因为这些占位符被替换的文件是源代码控制的,我真的不想做一个字符串替换然后意外地提交一些具有硬编码开发人员 API 地址的代码,因为这会在生产中中断。

额外信息:我确实在我的应用程序中使用了 Grunt,我部署到 Windows(很遗憾,无法更改),我使用 Git 进行源代码控制,我使用 Bamboo 进行构建/部署。

非常乐意回答有关我的问题的任何其他问题。

注意:我不仅需要为前端替换配置值,还需要为后端替换配置值(即,当我启动节点服务器时,我希望它启动的端口是可配置的。

谢谢!

【问题讨论】:

  • 后端的环境变量可以告诉后端在每个页面中放入什么 Javascript 变量,以便前端可以使用该 JS 变量来知道要使用的 api DNS 名称。或者您可以编写前端代码以检查此类变量,如果未找到,它将使用生产环境。如果找到,它将使用那里的任何东西。
  • @jfriend00 - 前端怎么知道后端的环境变量是什么?对我来说,这听起来像是先有鸡还是先有蛋的问题。
  • 如果你再读一遍,我说后端会在每个页面中放置一个 JS 变量来指示使用什么。因为JS变量在页面中,所以前端JS可以使用。
  • 后端如何将 Javascript 放入每个页面?这是一个 Angular 应用程序。
  • 我自己并不了解 Angular,但是您是否有能力在服务器上的页面被发送到客户端以注入脚本标签或修改变量的值之前对其进行修改?它是后端的 nodejs,因此任何模板渲染引擎都可以做到这一点。

标签: angularjs node.js api


【解决方案1】:

我正在使用gulp-ng-config ,它允许根据节点环境变量将动态生成的角度常量添加到我的应用程序中。

在上面链接的文档中,是一个为前端应用程序提供不同 api url 的示例,我确定有一个 grunt 版本,实际上 grunt-ng-config 看起来是等价的。 values 配置选项采用一个函数,您可以在其中根据节点环境变量返回一些内容

【讨论】:

  • 看起来很棒!我唯一的问题是,由于它在它接触的模块中进行字符串替换,并且它接触的模块是源代码控制的,它会将这些文件标记为已更改,我不想提交结果,因为这会破坏生产和分期构建。我将如何处理这个问题?
  • 我不确定你的意思是它在它接触的模块上进行字符串替换。我已将它创建的文件的名称添加到我的 gitignore 列表中,这就是我必须明智地进行源代码管理
  • 字符串替换只是采用一个模式并用其他东西替换它:)
  • 好吧,我没有遇到任何源代码管理问题。它生成的结果模块文件在我的 gitignore 列表中。我也没有提交最终的级联/缩小源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多