Я использую 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
никогда не запускается.