2017-10-30 6 views
0

Ich stosse meinen Kopf gegen eine Wand, um Knoten commander Modul zu bekommen Argumente zu parsen, wie ich will.Node.js Commander mit optionalen + variadic Argumente

Ich möchte eine Liste von Dateien in eine benannte Datenbank hochladen. Es gibt einen Standarddatenbanknamen, so dass der Benutzer nicht benötigen sollte, um einen Datenbankparameter aufzunehmen.

ich diesen Befehl möchte wie folgt arbeiten:

>>> ./upload.js --db ReallyCoolDB /files/uploadMe1.txt /files/uploadMe2.txt 
(uploads "uploadMe1.txt" and "uploadMe2.txt" to database "ReallyCoolDB") 

>>> ./upload.js /files/uploadMe1.txt /files/uploadMe2.txt 
(uploads "uploadMe1.txt" and "uploadMe2.txt" to the default database) 

>>> ./upload.js --db ReallyCoolDB 
(returns an error; no files provided) 

Wie kann ich das umsetzen mit commander? Ich habe bereits eine Reihe von Dingen versucht, zur Zeit ich mit diesem Code bin stecken, die nicht funktioniert:

// upload.js: 

#!/usr/bin/env node 

var program = require('commander'); 
program 
    .version('0.1.0') 
    .description('Upload files to a database') 
    .command('<path1> [morePaths...]') 
    .option('-d, --db [dbName]', 'Optional name of db', null) 
    .action(function(path1, morePaths) { 

    // At this point I simply want: 
    // 1) a String "dbName" var 
    // 2) an Array "paths" containing all the paths the user provided 
    var dbName = program.db || getDefaultDBName(); 
    var paths = [ path1 ].concat(morePaths || []); 
    console.log(dbName, paths); 

    // ... do the upload ... 

    }) 
    .parse(process.argv); 

Wenn ich versuche ./upload.js zu laufen, bekomme ich keine Ausgabe!

Wie kann ich Commander verwenden, um einen einzelnen optionalen Parameter und eine nicht leere Liste von Zeichenfolgen zu akzeptieren?

EDIT: Dank Rob Raischs Antwort habe ich mein Problem gelöst! Die Lösung ist usage anstelle von action zu verwenden, macht alle Arbeiten nach den program Befehlen (statt innerhalb einer action-Funktion), die Arbeit mit program.db und program.args und manuell sicherzustellen, dass program.args nicht leer ist:

var program = require('commander'); 

program 
    .version('0.1.0') 
    .description('Upload files to a database') 
    .usage('[options] <path1> [morePaths ...]') // This improves "--help" output 
    .option('-d, --db [dbName]', 'Optional name of db', null) 
    .parse(process.argv); 

var dbName = program.db || getDefaultDBName(); 
var paths = program.args; 

if (!paths.length) { 
    console.log('Need to provide at least one path.'); 
    process.exit(1); 
} 

// Do the upload! 

Antwort

1

die README.md-Datei für die commander Kommandozeilenverarbeitungsmodul beantwortet Ihren Anwendungsfall in seinem zweiten Absatz:.

„Optionen mit Kommandant mit der .option() Methode definiert, die auch als Dokumentation für die Optionen dienen Das folgende Beispiel parst args und Optionen von proc ess.argv, übrig gebliebene Argumente als die program.args Arrays, die nicht von Optionen verbraucht wurden. "

+0

Also, was ist der richtige Weg, um einen optionalen Parameter + eine nicht leere Liste mit 'commander' zu akzeptieren? Sollte ich Commander verwenden, um den optionalen Parameter zu analysieren und dann 'program.args' manuell zu parsen? –

+0

Dank dieser Antwort habe ich es herausgefunden! –

Verwandte Themen