Input e Output — readline
Aqui está o guia completo sobre Input e Output em JavaScript com Node.js:
Entrada e Saída (I/O) no Node.js
Quando você programa, precisa de duas coisas básicas: mostrar informações para o usuário (output) e receber informações dele (input). No Node.js, isso funciona de um jeito específico, diferente do navegador.
Output com console.log()
O console.log() é a forma mais comum de mostrar informações no terminal. Ele exibe o que você passar entre parênteses.
// Exibindo texto simples
console.log("Olá, mundo!");
// Exibindo números
console.log(42);
// Exibindo variáveis
let nome = "Maria";
console.log(nome);
// Exibindo múltiplos valores
console.log("O resultado é:", 10 + 5);
// Exibindo objetos e arrays
console.log({ nome: "João", idade: 30 });
console.log([1, 2, 3, 4, 5]);
Dica importante: O console.log() sempre adiciona uma quebra de linha no final. Isso significa que cada chamada dele aparece em uma linha separada.
Output sem quebra de linha: process.stdout.write()
Diferente do console.log(), o process.stdout.write() não adiciona quebra de linha automaticamente. Isso é útil quando você quer construir uma saída gradualmente.
// Escreve sem quebrar linha
process.stdout.write("Olá, ");
process.stdout.write("mundo!");
// Resultado: Olá, mundo! (tudo na mesma linha)
// Para quebrar linha manualmente
process.stdout.write("Primeira linha\n");
process.stdout.write("Segunda linha\n");
Exemplo prático: Criar uma barra de progresso simples.
let progresso = 0;
const total = 10;
for (let i = 1; i <= total; i++) {
progresso = Math.round((i / total) * 100);
process.stdout.write(`\rProgresso: ${progresso}%`);
// O \r volta para o início da linha
}
Output de erros: console.error()
Para mensagens de erro, use console.error(). Ele funciona igual ao console.log(), mas direciona a saída para o fluxo de erros (stderr).
console.error("Erro: arquivo não encontrado!");
console.error("Falha na conexão com o banco de dados");
// Útil para diferenciar saída normal de erros
console.log("Processo iniciado com sucesso");
console.error("Algo deu errado durante a execução");
Por que usar console.error()? Em sistemas mais complexos, você pode redirecionar a saída normal para um arquivo e os erros para outro, facilitando a depuração.
Input com readline
Para receber dados do usuário no terminal, usamos o módulo readline. Ele precisa ser configurado em três etapas:
- Importar o módulo
- Criar a interface
- Usar os métodos de leitura
Criando a interface readline
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin, // Teclado
output: process.stdout // Terminal
});
Lendo dados com question()
O método question() recebe uma pergunta e uma função de callback que processa a resposta.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Qual é o seu nome? ", (nome) => {
console.log(`Olá, ${nome}!`);
rl.close();
});
Exemplo completo: Calculadora simples
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Digite o primeiro número: ", (num1) => {
rl.question("Digite o segundo número: ", (num2) => {
const resultado = Number(num1) + Number(num2);
console.log(`A soma é: ${resultado}`);
rl.close();
});
});
Fechando a interface com close()
Sempre feche a interface readline quando terminar de usá-la. Isso libera recursos do sistema.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("Digite algo: ", (resposta) => {
console.log("Você digitou:", resposta);
rl.close(); // Importante!
});
// Após fechar, não é possível mais usar rl.question()
Programa completo: Coleta de dados do usuário
Vamos criar um programa que coleta nome, idade e cidade do usuário:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log("=== Cadastro de Usuário ===\n");
rl.question("Nome: ", (nome) => {
rl.question("Idade: ", (idade) => {
rl.question("Cidade: ", (cidade) => {
// Limpa o terminal (funciona na maioria dos terminais)
console.clear();
console.log("=== Dados Cadastrados ===\n");
console.log(`Nome: ${nome}`);
console.log(`Idade: ${idade} anos`);
console.log(`Cidade: ${cidade}`);
// Validação básica
if (Number(idade) < 18) {
console.error("Aviso: Usuário menor de idade!");
}
rl.close();
});
});
});
Erros comuns e como evitá-los
Erro 1: Esquecer de fechar o readline
// ERRADO - O programa não termina
rl.question("Nome: ", (nome) => {
console.log(nome);
});
// CERTO
rl.question("Nome: ", (nome) => {
console.log(nome);
rl.close();
});
Erro 2: Tentar usar question após close
// ERRADO
rl.close();
rl.question("Isso não funciona!", () => {}); // ERRO!
// CERTO - Sempre feche depois de todas as perguntas
Erro 3: Não converter string para número
rl.question("Digite um número: ", (numero) => {
// ERRADO - Concatena strings
console.log(numero + 10); // "510" se digitou 5
// CERTO - Converte para número
console.log(Number(numero) + 10); // 15
});
Erro 4: Usar console.log quando deveria usar console.error
// ERRADO - Mistura saída normal com erros
console.log("Erro: arquivo não encontrado");
// CERTO - Separa os fluxos
console.error("Erro: arquivo não encontrado");
Dicas finais
- Sempre valide os dados recebidos do usuário antes de usar
- Use template strings (crases) para montar mensagens complexas
- Limpe a saída com
console.clear()quando necessário - Teste seu código com diferentes tipos de entrada
- Documente as funções que criarem para facilitar a manutenção
Com esses conceitos, você já consegue criar programas interativos no terminal usando Node.js!