Skip to content

Aceitar entrada do comando de linha no Node.js

Como tornar um programa CLI Node.js interativo?

O Node.js, desde a versão 7, fornece o módulo readline para fazer exatamente isso: obter entrada de um fluxo legível, como o fluxo process.stdin, que durante a execução de um programa Node.js é a entrada do terminal, linha por linha.

javascript
const readline = require('node:readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.question("Qual o seu nome?", name => {
    console.log('Olá ' + name + '!');
    rl.close();
});

Este trecho de código pergunta o nome do usuário e, assim que o texto é inserido e o usuário pressiona Enter, 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 Enter é pressionado.

Nesta função de retorno de chamada, fechamos a interface readline.

readline oferece vários outros métodos, por favor, verifique-os na documentação do pacote vinculada acima.

Se você precisar solicitar uma senha, é melhor não exibi-la, mas sim mostrar um símbolo *.

A maneira mais simples é usar o pacote readline-sync, que é muito semelhante em termos da API e lida com isso diretamente. Uma solução mais completa e abstrata é fornecida pelo pacote Inquirer.js.

Você pode instalá-lo usando npm install inquirer, e então você pode replicar o código acima assim:

javascript
const inquirer = require('inquirer');
const questions = [
    {
        type: 'input',
        name: 'name',
        message: "Qual o seu nome?"
    }
];
inquirer.prompt(questions).then(answers => {
    console.log('Olá ' + answers.name + '!');
});

Inquirer.js permite que você faça muitas coisas, como fazer perguntas de múltipla escolha, ter botões de rádio, confirmações e muito mais.

Vale a pena conhecer todas as alternativas, especialmente as integradas fornecidas pelo Node.js, mas se você planeja levar a entrada CLI para o próximo nível, Inquirer.js é uma escolha ideal.