在用 meteor 开发时,为了在生产环境、测试环境使用不同的配置(数据库连接、接口服务等)
一段时间以来都是个麻烦的问题。经过实践,总结了一个较成熟的解决办法。
现在部署 node 的项目最流行的工具是 pm2 。pm2 可以设置自己的配置文件,很强大。
meteor 社区推荐的项目结构里面的private
目录是只能在服务端被访问到的,这便是配置存放的绝佳地方。
1 | private ├── development.settings.json ├── production.settings.json └── test.settings.json |
三个文件分别对应不同的环境,把相关的配置写在里面,而我的 pm2 配置文件里面使用NODE_ENV
参数来区分环境。
1 | { "apps": [{ "name": "app", "script": "~/app/bundle/main.js", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "exec_mode": "fork_mode", "env": { "ROOT_URL": "http://www.test.com", "MONGO_URL": "mongodb://127.0.0.1:27017/app", "PORT": 3000, "NODE_ENV": "production" } }] } |
最后在自己写一个函数提供给其他需要配置的地方调用,统一入口。
1 | var settings, ENV = process.env.ENV; Meteor.customMethods = { getSetting: function(field) { try { let settingFile = ENV + '.settings.json'; settings = JSON.parse(Assets.getText(settingFile)); console.log(`get setting from ${settingFile}`); } catch (e) { console.log(e); settings = JSON.parse(Assets.getText('dev.settings.json')); } return settings[field]; } } |
这样的话,就能方便的分离配置了。
值得注意的是,Meteor 如果是在开发环境用meteor run
运行,那么默认 NODE_ENV == 'development'
。
比如你执行了export NODE_ENV=test
,然后meteor run
跑起来,你会发现NODE_ENV还是development。
除非在代码里面动态修改这个值,否则环境变量的配置将不起作用。
解决了服务端的配置问题,但是如果在客户端你也想使用这个配置怎么办呢?我的方法是在客户端利用Meteor.startup()
解决问题。1
Meteor.startup(function() {
//执行配置获取代码
Meteor.settings = getSetting();
});
这样在其他任何地方也都可以使用在服务配置好的相关配置了。