🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Accettare input da CLI in Node JS

Codegrind Team•Nov 22 2023

Come rendere interattivo un programma CLI in Node.js?

Node.js dalla versione 7 fornisce il modulo readline per fare esattamente questo: ottenere l’input da uno stream leggibile come lo stream process.stdin, che durante l’esecuzione di un programma Node.js è l’input del terminale, una riga alla volta.

const readline = require("node:readline").createInterface({
  input: process.stdin,
  output: process.stdout,
});

readline.question(`Qual è il tuo nome?`, (name) => {
  console.log(`Ciao ${name}!`);
  readline.close();
});

Questo frammento di codice chiede il nome dell’utente e una volta inserito il testo e premuto invio, inviamo un saluto.

Il metodo question() mostra il primo parametro (una domanda) e attende l’input dell’utente. Chiama la funzione di callback una volta premuto invio.

In questa funzione di callback, chiudiamo l’interfaccia di readline.

readline offre diversi altri metodi, consulta la documentazione del pacchetto linkato sopra per ulteriori dettagli.

Se devi richiedere una password, è meglio non rifletterla, ma mostrare invece un simbolo *.

Il modo più semplice è utilizzare il pacchetto readline-sync, che è molto simile in termini di API e gestisce questo aspetto di default.

Una soluzione più completa e astratta è fornita dal pacchetto Inquirer.js.

Puoi installarlo con npm install inquirer, e poi puoi replicare il codice sopra in questo modo:

const inquirer = require("inquirer");

const questions = [
  {
    type: "input",
    name: "name",
    message: "Qual è il tuo nome?",
  },
];

inquirer.prompt(questions).then((answers) => {
  console.log(`Ciao ${answers.name}!`);
});

Inquirer.js ti consente di fare molte cose, come chiedere scelte multiple, avere pulsanti radio, conferme e altro ancora.

È utile conoscere tutte le alternative, specialmente quelle integrate fornite da Node.js, ma se prevedi di portare l’input da riga di comando al livello successivo, Inquirer.js è una scelta ottimale.