2016-02-12 12 views
10

Chcę korzystać z konfiguracji źródła danych o różnych środowiskach w aplikacji Strongloop. Widziałem na https://docs.strongloop.com/display/public/LB/Environment-specific+configuration że priorytetem konfiguracjach są:Aplikacja Strongloop nie ładuje lokalnego źródła danych

  1. środowiska specyficzne dla konfiguracji, w oparciu o wartości NODE_ENV; na przykład, server/config.staging.json.
  2. Lokalny plik konfiguracyjny; na przykład, server/config.local.json.
  3. Domyślny plik konfiguracyjny; na przykład, server/config.json.

mam zadeklarowane trzy DataSource pliki conf: datasources.json:

{} 

datasources.local.json:

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

i 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' 
    } 
}; 

Teraz, chyba że ustawię konfigurację datasources.local.json w datasources.json, to nie działa. Wciąż dostaję błąd: AssertionError: User is referencing a dataSource that does not exist: "db"

Próbowałem również dodać lokalny conf do inscenizacji conf i zdefiniowałem zmienną NODE_ENV, ale nie załadowałbym ani datasource.staging.js. I zdefiniował NODE_ENV wykonując:

export NODE_ENV=staging 
+0

Hmm ... co jeśli usuniesz w przeciwnym razie pusty plik 'datasources.json'? – jakerella

+0

próbowałem, nie działa, co jeszcze mogę spróbować? – Sanandrea

+0

Czy to możliwe, że twoje obecne środowisko jest w rzeczywistości "inscenizacją"? Widzę, że plik konfiguracyjny datasource * nie ma * właściwości 'name' w definicji. Potrzebowałby tego niezależnie. – jakerella

Odpowiedz

9

użyłem node-debug wyśledzić problem. I stało się w tym konkretnym pliku źródłowego strongloop:

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

funkcję:

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); 
    } 
    } 
} 

nie połączą configs jeśli "db" klucz nie jest zdefiniowany w pliku głównym tj datasources.json.

Więc, po prostu zmodyfikował datasources.json do:

{ 
    "db": {} 
} 

i to działa!

Może to moja wina, ale dokumentacja nie jest wystarczająco jasna.

+2

To nie jest tak oczywiste, jak jest napisane w dokumentacji, ale w rzeczywistości można tylko przesłonić parametry, nie tworzyć ich w alternatywnych konfiguracjach 'Możesz ** przesłonić ** wartości ** ustawione ** w config. json w: config.local.js lub config.local.json config.env.js lub config.env.json, gdzie env to wartość NODE_ENV' – Overdrivr

+0

Tak, masz rację! to oczywiście moja wina :) – Sanandrea

+0

Nie jestem pewien, czy tak jest dokładnie - podaję port w 'config.local.js', ale nie w' config.json', a aplikacja uruchamia się na oczekiwanym porcie. – emc

0

trick jest dodanie wszystkich źródeł danych (Pamięć/REDIS/Mongo/POSTGRES'a) w datasources.json i następnie zastąpić parametry datasources.local.js lub datasources.staging.js lub datasources.production.js

Przykładowa konfiguracja pliku:

źródła danych.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' 
    } 
}; 

sprzężenia zwrotnego zastąpi nazwę bazy danych w tym przypadku podobnie można przesłonić inne parametry źródła danych, takie jak port i użytkownik

Powiązane problemy