Commander.js - Реализация подкоманд, которые выполняются после завершения предыдущей - PullRequest
0 голосов
/ 13 июня 2019

Я использую Commander.js , чтобы написать свой CLI. Мне удалось написать команды, которые работают индивидуально, но теперь мне нужно реализовать подкоманды, но документы немного расплывчаты и запутаны, поэтому я не смог разобраться.

Мне нужна команда connect для подключения к экземпляру MongoDB, и когда это будет сделано, перейдите к выполнению команды get. Как мне этого добиться?

Это команды и package.json:

/ package.json :.

{
  ...
  "main": "./commands/my-cli.js",
  "bin": "./commands/my-cli.js",
  ...
}

/ Команды / My-cli.js :.

const commander = require('commander');
const program = new commander.Command();

const connect = require('./my-cli-connect');
const get = require('./my-cli-get');

// Initialize each command
connect(program);
get(program);

/ Команды / My-CLI-connect.js :.

function connect(program) {

  program
    .command('connect <db> <username> <password>', 'Connects to a database')
    .action((db, username, password) => {

      MongoClient.connect(<some-mongo-url>, {useNewUrlParser: true}, (err, connection) => {

        assert.equal(null, err, 'Failed to connect to MongoDB instance');

        // Continue here with the get command
      });
    }); 

  program.parse(process.argv);
}

module.exports = connect;

/ Команды / My-CLI-get.js :.

function get(program) {

  program
    .command('get <collection>')
    .option('-q,--query <query>', 'Search terms', jsonParser, {})
    .description('Returns documents from a MongoDB collection')
    .action(action);

  program.parse(process.argv);

  function action(collection, options) {

    // This never runs
    console.log('hello world');
  }
}

module.exports = get;

Запуск my-cli --help показывает следующие доступные команды:

...

Commands:
  connect <db> <username> <password>  Connects to a database
  help [cmd]                          display help for [cmd]

Пример выполнения команды, которая должна вызвать как connect, так и get, когда connect завершит соединение:

$ my-cli connect myDb myUser myPass get users -q '{"email": "foo@gmail.com"}'

Сейчас функция action команды get никогда не запускается.

...