Приложение Strongloop не загружает локальный источник данных

Я хочу использовать разные конфигурации источников данных в приложении Strongloop. Я видел в https://docs.strongloop.com/display/public/LB/Environment-specific+configuration, что приоритет конфигураций таков:

  • Конфигурация, зависящая от среды, на основе значения NODE_ENV; например, server/config.staging.json.
  • Локальный файл конфигурации; например, server/config.local.json.
  • Файл конфигурации по умолчанию; например, server/config.json.

Я объявил три файла confat datasource: 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

Ответ 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" не указан в основном файле i.e. datasources.json.

Итак, я просто изменил datasources.json на:

{
  "db": {}
}

и это сработало!

Возможно, это моя ошибка, но документация недостаточно ясна.

Ответ 2

Трюк состоит в том, чтобы добавить все источники данных (memory/redis/mongo/postgres) в datasources.json, а затем переопределить параметры в 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 будет переопределять имя базы данных в этом случае аналогичным образом вы можете переопределить другие параметры источника данных, такие как порт и пользователь