Strongloop应用程序不加载本地数据源

时间:2016-02-12 14:04:26

标签: javascript json loopbackjs strongloop

我想在Strongloop应用程序中使用不同的特定于环境的数据源配置。我在https://docs.strongloop.com/display/public/LB/Environment-specific+configuration看到配置的优先级是:

  1. 特定于环境的配置,基于NODE_ENV的值; 例如,server / config.staging.json。
  2. 本地配置文件; 例如,server / config.local.json。
  3. 默认配置文件; 例如,server / config.json。
  4. 我已经声明了三个数据源配置文件: datasources.json

    {}
    

    datasources.local.json

    {
      "db": {
        "name": "db",
        "connector": "loopback-connector-mongodb",
        "host":"127.0.0.1",
        "port": "27017",
        "database": "woowDev"
      }
    }
    

    datasources.staging.js

    module.exports = {
      db: {
        connector: 'mongodb',
        hostname: process.env.OPENSHIFT_MONGODB_DB_HOST,
        port: process.env.OPENSHIFT_MONGODB_DB_PORT,
        user: process.env.OPENSHIFT_MONGODB_DB_USERNAME,
        password: process.env.OPENSHIFT_MONGODB_DB_PASSWORD,
        database: 'woow'
      }
    };
    

    现在除非我在datasources.json中放置datasources.local.json的配置,否则它不起作用。我一直收到错误:AssertionError: User is referencing a dataSource that does not exist: "db"

    我还尝试将本地conf添加到staging conf并定义变量NODE_ENV,但它不会加载datasource.staging.js。我通过执行以下操作定义了NODE_ENV:

    export NODE_ENV=staging
    

2 个答案:

答案 0 :(得分:9)

我使用node-debug来追踪问题。它出现在这个特定的源文件中:

node_modules/loopback-boot/lib/config-loader.js

功能:

function mergeDataSourceConfig(target, config, fileName) {
  for (var ds in target) {
    var err = applyCustomConfig(target[ds], config[ds]);
    if (err) {
      throw new Error('Cannot apply ' + fileName + ' to `'  + ds + '`: ' + err);
    }
  }
}
如果未在主文件"db"中定义datasources.json密钥,

将不会合并配置。

所以,我刚刚将datasources.json修改为:

{
  "db": {}
}

它有效!

也许这是我的错,但文档不够明确。

答案 1 :(得分:0)

Trick是在datasources.json中添加所有数据源(memory / redis / mongo / postgres),然后覆盖datasources.local.js或datasources.staging.js或datasources.production.js中的参数

示例文件配置:

<强> datasources.json

{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "redisDS": {
    "name": "redisDS",
    "connector": "redis"
  },
  "testPostgress": {
    "port": 5432,
    "name": "localPostgress",
    "user": "akumar",
    "connector": "postgresql"
  }
}

<强> datasources.staging.js

module.exports = {
  db:{
    connector: 'memory'
  },
  redisDS:{
    connector: 'redis'
  },
  testPostgress:{
    database:'stagingPostgress'
  }
};
在这种情况下,

Loopback将覆盖数据库名称,类似地,您可以覆盖其他数据源参数,如port和user