2017-01-10 43 views
0

我正在尝试将我的Meteor应用程序部署到AWS Elastic Beanstalk。它们不支持JSON对象作为环境变量,所以需要有一个解决方法。我上传settings.json文件/tmp/settings.json和保存路径为process.env.METEOR_SETTINGS_FILE然后在服务器文件我做到以下几点:启动后添加客户端的流星设置配置

if (Meteor.isProduction) { 
    var meteorFile = process.env.METEOR_SETTINGS_FILE; 
    if(meteorFile == undefined) throw new Error(
    'METEOR_SETTINGS_FILE env variable must be defined in production.') 
    var fs = Npm.require('fs'); 
    var pjsonBuf = fs.readFileSync(meteorFile); 
    Meteor.settings = JSON.parse(pjsonBuf.toString().trim()); 
    Meteor.settings.public = Meteor.settings.public; 
} 

然而,在客户端上我仍然得到Uncaught TypeError: Cannot read property 'writeKey' of undefined不确定的地方需要被Meteor.settings.public.segment。我有一个空的对象Meteor.settings.public,如果我在上面的文件中我console.log(Meteor.settings),他们都在那里。

+0

使用下面的命令启动流星
流星--settings settings.json –

+1

这是行不通的,因为你不行在生产服务器上运行'流星' – Mikkel

回答

0

下面是使用环境变量的解决方案:

想必弹性魔豆允许您指定的环境变量,无论是在shell脚本或配置文件。我的例子使用Nginx/Passenger。

# Tell the app where MongoDB is 
passenger_env_var MONGO_URL mongodb://localhost:27017/amba; 
# Tell the app what its other settings are 
passenger_env_var ROOT_URL https://dev1.amba.online; 
passenger_env_var PEERJS_SERVER https://member2.myserver.com:9002/n5rdmnddd8q2z3q5mi; 

passenger_env_var IMAGE_DIR /var/www/imgserver/public; 

在服务器中,一个流星方法读取的环境变量并将其插入到一个表:

// Get a list of environment vars and put them in the Environs collection 
// - client code will pick these up and handle them. 
    getEnvirons: function() { 
    Environs.remove({}); // Force them to be re-read every time 
    var toGet = ["PEERJS_SERVER", "ROOT_URL", "IMAGE_DIR"]; 
    _.each(toGet, function(e){ 
     var val = process.env[e]; 
     Environs.insert({name: e, value: val}); 
    }); 
    }, 

呼叫从服务器中的流星启动块以上。

所有仍有待完成的事情是发布Environs集合并订阅它。 (我假设你知道如何做到这一点)。环境变量数据的加载过程当然是异步的,所以在代码中允许使用