2016-02-12 15 views
10

Desidero utilizzare diverse configurazioni di origine dati specifiche dell'ambiente in un'applicazione Strongloop. Ho visto al https://docs.strongloop.com/display/public/LB/Environment-specific+configuration che la priorità di configurazioni sono:L'app Strongloop non carica l'origine dati locale

  1. configurazione, in base al valore di NODE_ENV specifici dell'ambiente; ad esempio server/config.staging.json.
  2. File di configurazione locale; ad esempio server/config.local.json.
  3. File di configurazione predefinito; ad esempio, server/config.json.

ho dichiarato file conf tre origine dati: datasources.json:

{} 

datasources.local.json:

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

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

Ora, a meno che non metta la configurazione di datasources.local.json in datasources.json non funzioni. Continuo a ricevere l'errore:

Ho provato anche ad aggiungere il conf locale alla staging conf e ho definito la variabile NODE_ENV, ma non avrebbe caricato né datasource.staging.js. Ho definito il NODE_ENV facendo:

export NODE_ENV=staging 
+0

Hmm ... cosa se elimini il file 'datasources.json' altrimenti vuoto? – jakerella

+0

provato, non funziona, cos'altro posso provare? – Sanandrea

+0

È possibile che il tuo ambiente attuale sia in effetti "staging"? Vedo che il file di configurazione datasource * non ha * una proprietà 'name' nella definizione. Ne avrebbe bisogno a prescindere. – jakerella

risposta

9

ho usato node-debug di rintracciare il problema. E ne è venuto in questo particolare file sorgente strongloop:

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

la funzione:

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

non si fonderanno configurazioni se "db" chiave non è definito nel file master cioè datasources.json.

Allora, ho appena modificato il datasources.json a:

{ 
    "db": {} 
} 

e ha funzionato!

Forse è colpa mia ma la documentazione non è abbastanza chiara.

+2

Non è davvero ovvio il modo in cui è scritto nella documentazione, ma in effetti è possibile solo sovrascrivere i parametri, non crearli in configurazioni alternative 'È possibile ** sostituire i valori ** impostati ** in config. json in: config.local.js o config.local.json config.env.js o config.env.json, dove env è il valore di NODE_ENV' – Overdrivr

+0

Sì hai ragione! è chiaramente colpa mia :) – Sanandrea

+0

Non sono così sicuro che sia esattamente il caso - Specifico una porta in 'config.local.js' ma non in' config.json' e l'app si avvia sulla porta prevista. – emc

0

trucco è quello di aggiungere tutte le origini dati (memoria/Redis/mongo/postgres) in datasources.json e quindi sostituire i parametri in datasources.local.js o datasources.staging.js o datasources.production.js

Esempio di configurazione del file:

origini dati.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 avrà la precedenza il nome del database, in questo caso allo stesso modo è possibile ignorare gli altri parametri come origine dati porto e utente