如何使用 process.env 将环境变量中的 API 密钥传递给 Ember CLI?

Posted

技术标签:

【中文标题】如何使用 process.env 将环境变量中的 API 密钥传递给 Ember CLI?【英文标题】:How to pass API keys in environment variables to Ember CLI using process.env? 【发布时间】:2014-12-11 18:10:11 【问题描述】:

如何将环境变量从 bashrc 传递到 Ember CLI。我想象一种情况,您需要条带 api 密钥或推送器 api 密钥,并且您将它们放在 bashrc 的环境变量中。如何将 api-keys 传递给 Ember CLI。

我尝试在 brocfile.jsenvironment.js 中使用 Node.js process.env,但是当我尝试在 Ember JS 控制器中访问它时,该属性为空。

在我添加的environment.js 文件中,

APP:  apiKey: process.env.KEY 

在我的 Ember JS 控制器中,我尝试通过以下方式访问它:

import config from  '../config/environment'; 

并设置控制器属性lkey如下图,不起作用:

lkey: config.App.KEY

接下来在我的brocfile.js 中,我补充说:

var limaKey = process.env.Key; 
var app = new EmberApp(key: limaKey);

这还是不行。

【问题讨论】:

ember rails 不是 ember-cli 顺便说一句 我知道,你可以看到他们的名字不同,所以我知道他们是不同的。我的示例显示了使用 ember-rails 时如何处理它,我正在询问如何使用 ember-cli 来处理它。请参阅我的问题的最后一行。 类似的东西可能需要绑定到 ember-cli 的构建过程或 environment.js 文件中。一种快速而肮脏的方法是只使用 environment.js 文件中的节点来读取您在 rails 应用程序中存储密钥的任何位置,并将它们添加到应用程序的环境配置中。 假设您正在使用 secrets.yml 或 application.yml 之类的东西来存储它们,以便您可以读取它们 是的,我正在使用 secrets.yml。我现在正在尝试在 environment.js 文件中使用 node,使用 process.env.xxx 来 bashrc 文件中的环境变量。欢呼 【参考方案1】:

关键是在config/environment.js 中定义ENV 变量,当您需要在某个地方(即适配器、控制器等)访问它们时,您首先导入config/environment.js

对于 Ember CLI 应用程序,https://ember-cli.com/user-guide/#Environments 记录了此内容,供您参考。

示例逻辑:

# app/controllers/foobar.js
import DS from 'ember-data';
import ENV from 'nameOfApp/config/environment';

export default Ember.Controller.extend(
  actions: 
    click: function() 
      console.log(ENV.SOME_ENVIRONMENT_KEY);
    
  
);

# config/environment.js
module.exports = function(environment) 
  ....

  if (environment === 'development') 
    ENV.SOME_ENVIRONMENT_KEY = 'asdf1234';
  

  ...
;

【讨论】:

我更强调在 ember build 的命令行中指定选项的原始问题,例如 --environment=staging --key=【参考方案2】:

我终于解决了这个问题。我面临两个选择。选项 1 是使用 XHR 从服务器上的端点获取 api-keys。选项 2 是使用 Nodejs process.env 直接从环境变量中获取 api-key。我更喜欢选项 2,因为它使我免于执行 XHR 请求。

您可以使用依赖于 Nodejs Dotenv 项目的 ember-cli-addOn 获得选项 2

https://github.com/fivetanley/ember-cli-dotenv https://github.com/motdotla/dotenv

就我而言,我选择不使用任何插件。

    如果您是 Ubuntu 或您自己的 linux 发行版的适当位置,请首先将 api-key 添加到您的 .bashrc
export API_KEY=NwPyhL5
    重新加载.bashrc 文件,以便您的设置被拾取:
source ~/.bashrc
    在 Ember CLI 中,将属性添加到 config/environment.js 中的 ENV 对象。默认是这样的
module.exports = function(environment) 
  var ENV = 
     modulePrefix: 'rails-em-cli',
     environment: environment,
     baseURL: '/',
     locationType: 'auto',
     EmberENV: 

      
   

现在,我们可以向 ENV 对象添加一个新属性 myApiKey,如下所示:

module.exports = function(environment) 
  var ENV = 
    modulePrefix: 'rails-em-cli',
    environment: environment,
    baseURL: '/',
    locationType: 'auto',
    myApikey: null,
    EmberENV: 

     

   //assign a value to the myApiKey

     if (environment === 'development') 
        // ENV.APP.LOG_RESOLVER = true;

        ENV.myApiKey = process.env.API_KEY;
                    

   

请注意,process.env.API_KEY 正在获取我们添加到 .bashrc 的设置并将其分配给 myApiKey。您需要在服务器上安装 Nodejs,process.env 才能正常工作。

最后在你的控制器中访问那个变量

import config from '../config/environment';
import Ember from 'ember';

export default Ember.Controller.extend(

  yourKey: config.myApikey,

);

就是这样。

【讨论】:

我这边不需要任何这些 ember 插件。 process.env.API_KEY 够了!【参考方案3】:

我想确保我的 API 密钥没有被签入。作为构建过程的一部分,我将本地配置文件复制到 config 目录并将其加载到 environment.js

environment.js

try 
  var local = require('./local_environment');
  Object.keys(local.config).forEach(function(key) 
    ENV[key] = local.config[key];
  );
 catch(err) 
  console.log("config/local_environment.js not found");

local_environment.js(未签入,由构建过程复制)

exports.config = 
  SOME_API_KEY: 'key_here'
;

【讨论】:

【参考方案4】:

您还可以在ENV.APP 对象上设置变量:它们将由应用程序实例携带。

然后您可以在初始化程序等中重用它们。

这样,您不必将config/environment 导入应用程序的代码中,这对我来说有点奇怪。

【讨论】:

您能否添加一个如何使用应用实例访问它的示例?你的意思是使用this.container.lookup('application:main') 是的,我就是这个意思。

以上是关于如何使用 process.env 将环境变量中的 API 密钥传递给 Ember CLI?的主要内容,如果未能解决你的问题,请参考以下文章

vue中如何添加自定义环境变量 ,process.env取值报错undefined

如何在赛普拉斯运行的浏览器中使用 process.env 变量

process.env.NODE_ENV和env在webpack中的使用

Node环境变量Process.env

节点js,process.env不读取环境变量

Express 设置process.env.NODE_ENV变量