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

时间:2014-10-16 11:31:48

标签: ember.js ember-cli ember-router

如何将环境变量从bashrc传递到Ember CLI。我想象一种情况,你需要条带api键或pusher api-keys,你可以在bashrc中的环境变量中使用它们。如何将api-key传递给Ember CLI。

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

在我添加的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});

这仍然没有用。

4 个答案:

答案 0 :(得分:40)

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

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

在我的情况下,我选择不使用任何addOn。

  1. 首先将api-key添加到.bashrc,如果您是Ubuntu或者您自己的Linux发行版的合适地点。
  2. export API_KEY=NwPyhL5
    
    1. 重新加载.bashrc文件,以便提取您的设置:
    2. source ~/.bashrc
      
      1. 在Ember CLI中,向ENV中的config/environment.js对象添加属性。默认值如下所示
      2. 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 的设置。您需要在服务器上安装Nodej才能使 process.env 正常工作。

        最后要在你的控制器中访问该变量

        import config from '../config/environment';
        import Ember from 'ember';
        
        export default Ember.Controller.extend({
        
          yourKey: config.myApikey,
        
        });
        

        那就是它。

答案 1 :(得分:5)

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

然后你可以在初始化器和放大器中重复使用它们。等等。

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

答案 2 :(得分: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'
};

答案 3 :(得分:2)

关键是在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';
  }

  ...
};