Приложение 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 будет переопределять имя базы данных в этом случае аналогичным образом вы можете переопределить другие параметры источника данных, такие как порт и пользователь