Como tornar um programa CLI do Node.js interativo?
O Node.js desde a versão 7 fornece o módulo readline
para fazer exatamente isso: obter entrada de uma stream legíxel, como o fluxo process.astdin
, que durante a execução de um programa Node.js é a entrada do terminal, uma linha por vez.
const readline = require('readline').createinterface({
input: process.stdin,
output: process.stdout,
});
readline.question(`What's your name?`, name => {
console.log('Hi ${name}!');
readline.close();
});
Este pedaço de código pergunta o nome do usuário, e uma vez que o texto é digitado e o usuário pressiona enter, nós enviamos uma saudação.
O método question()
mostra o primeiro parâmetro (uma pergunta) e aguarda a entrada do usuário. Ele chama a função de retorno de chamada assim que o enter é pressionado.
Nesta função de retorno de chamada (a famosa callback), fechamos o readline interface
.
readline
oferece vários outros métodos, verifique-os na ducmentação do pacote colocada acima.
Se você precisar exigir uma senha, é melhor não repeti-la, mas mostrar um símbolo *
por exemplo.
A maneira mais simples é usar o pacote readline-sync
, que é muito semelhante em termos de API e lida com isso imediatamente.
Uma solução mais completa e abstrata é fornecida pelo pacote Inquirer.js.
Você pode instalá-lo usando npm install inquirer
e, em seguida, pode replicar o código acima assim:
const inquirer = require('inquirer');
const questions = [
{
type: 'input',
name: 'name',
message: "What's your name?"
}
]
inquirer.prompt(questions).then(answers => {
console.log(`Hi ${answers.name}!`);
});
O Inquirer.js permite que você faça muitas coisas, como fazer várias opções, ter botões de opção, confirmações e muito mais.
Vale a pena conhecer todas as alternativas, especialmente as oferecidas pelos módulos nativo do Node.js, mas se você planejava levar a entrada da CLI para o próximo nível, o Inquirer.js é a escolha ideal.