meteor 开发配置实践

在用 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();
});

这样在其他任何地方也都可以使用在服务配置好的相关配置了。

请我喝杯咖啡吧~