【问题标题】:Strongloop app does not load local datasourceStrongloop 应用程序不加载本地数据源
【发布时间】:2016-05-23 17:12:21
【问题描述】:

我想在 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。

我已经声明了三个数据源配置文件: 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.local.json 的配置放在 datasources.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

【问题讨论】:

  • 嗯...如果您删除原本为空的datasources.json 文件怎么办?
  • 试过了,不行,还有什么办法?
  • 您当前的环境是否可能实际上是staging?我看到您的暂存数据源配置文件没有在定义中具有name 属性。无论如何它都需要这个。
  • 哦,我认为连接器应该是mongodb
  • 不,我尝试将本地conf添加到staging conf并定义变量NODE_ENV,但它不会加载datasource.staging.js

标签: javascript json loopbackjs strongloop


【解决方案1】:

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

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": {}
}

它成功了!

也许是我的错,但文档不够清楚。

【讨论】:

  • 它在文档中的编写方式并不是很明显,但实际上您只能覆盖参数,而不是在替代配置中创建它们You can **override** values that are **set** in config.json in: config.local.js or config.local.json config.env.js or config.env.json, where env is the value of NODE_ENV
  • 我不太确定情况是否如此 - 我在 config.local.js 中指定了一个端口,但在 config.json 中没有指定一个端口,并且应用程序在预期的端口上启动。
【解决方案2】:

技巧是在 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 将覆盖数据库名称,类似地,您可以覆盖其他数据源参数,如端口和用户

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2014-04-10
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2014-07-23
    • 2012-09-25
    相关资源
    最近更新 更多