2015-04-30 18 views
17

Ho un semplice script di backend node.js e voglio acquisire gli argomenti della riga di comando insieme alle chiavi/valori da un file config.json e dalle variabili di ambiente. Il secondo due non ho problemi, ma sto avendo problemi quasi inspiegabili nel catturare gli argomenti della riga di comando.Catturare gli argomenti della riga di comando utilizzando NCONF

I possibile cattura gli argomenti della riga di comando in questo modo:

var nconf = require('nconf'); 
nconf.argv().env().file({file: './config.json'}); 

var csvFilePath = nconf.argv().get()._[0]; // var csvFilePath = process.argv[2]; 
var csvType = nconf.argv().get()._[1];  // var csvType = process.argv[3]; 

queste due chiamate sono equivalenti a process.argv [indice], eccetto l'indice è cambiato.

Ci deve essere un modo più semplice per catturare gli argomenti della riga di comando, ma anche quando eseguo il debug e guardo attraverso le variabili che nconf produce, non riesco ancora a capirlo.

Chiunque abbia esperienza con nconf si impegna ad aiutare?

+0

Stai chiedendo perché l'indice è diverso da 'nconf.argv()' di quello di 'process.argv'? –

risposta

9

Credo che il modo migliore per farlo è in questo modo:

//contents of app.js 
var nconf = require('nconf').argv(); 

Se si chiama il programma con il comando della riga di comando seguente:

node app.js --one foo --two bar 

quindi nel vostro programma è possibile accedere a questi Argomenti della riga di comando:

var nconf = require('nconf').argv(); 
var one = nconf.get('one'); //one = 'foo' 
var two = nconf.get('two'); //two = 'bar' 

quindi è necessario il simbolo - davanti all'identif Quindi, è possibile accedere agli argomenti della riga di comando.

Francamente, come un messaggio all'autore del modulo nconf Charlie Robbins, penso che sarebbe meglio non mischiare tutto in un unico grande hash.

Sarebbe meglio se avete fatto questo, invece:

var foo = nconf.argv.get('one'); 
var node_env = nconf.env.get('NODE_ENV'); 

penso che è più intuitivo e meno soggetto a errori.

Inoltre, per coloro che iniziano nodo con 'start NPM':

a mia conoscenza sono necessari due trattini in più in questo modo:

npm start -- --one foo --two bar 

con i trattini supplementare/trattini si lascia Bash sapere che il args sono per il vostro eseguibile node.js, non per il NPM Node.JS eseguibile

+1

Sui vostri commenti alla fine: potrei sbagliarmi, ma penso di non averli in un grosso hash tipo di sconfitte allo scopo di avere 'nconf'. Il punto è che si può avere una gerarchia sulla falsariga di "argv sovrascrive la variabile di ambiente che sovrascrive i valori predefiniti" o qualunque cosa si voglia.Se li tenga tutti separati in quel modo e gestisci le sostituzioni manualmente, allora non c'è davvero alcun senso nell'usare qualcosa come 'nconf'. Questo è il valore aggiunto. Non è necessario controllare a, quindi selezionare b, quindi controllare c. Basta controllare nconf. – Trott

+1

potresti ancora fornire sostituzioni e valori predefiniti per argv ed env, basta fare questo nconf.overrides ({argv: {}, env: {}}); e nconf.defaults ({argv: {}, env: {}}); non è così difficile. –

+1

Fornire valori predefiniti specifici per l'argv e per l'env specifico sconfigge l'intero scopo dell'uso di nconf. Se non hai motivo di avere nconf unire tutti gli elementi di configurazione in un singolo oggetto di configurazione, ti consiglio di usare qualcosa come "minimist' per argv piuttosto che usare' nconf'. – Trott

7

leggermente più corto/pulitore:

var nconf = require('nconf'); 
nconf.argv().env().file({file: './config.json'}); 

var csvFilePath = nconf.get('_')[0]; // var csvFilePath = process.argv[2]; 
var csvType = nconf.get('_')[1];  // var csvType = process.argv[3]; 

Se si assegna un nome al parametro (ad esempio, --foo=bar o -f bar), è possibile utilizzare .get('foo') o .get('f') anziché utilizzare l'indice di array.

+0

grazie per questo Trott- puoi parlare a cosa sta facendo .get ('_')? Per cosa è il lo-dash? –

+0

'nconf' usa' optimist' che usa '_' per una matrice di opzioni non trattate. In altre parole, sono gli argomenti al comando. Vedi https://github.com/substack/node-optimist#and-non-hypenated-options-too-just-use-argv_ per un esempio. – Trott

Problemi correlati