Node.js do Zero
Node.js executa JavaScript fora do navegador, no seu computador e em servidores. Você pode usar uma só linguagem no front-end e no back-end. O Node.js usa E/S não bloqueante, o que combina bem com trabalhos de rede e APIs. Este artigo executa o primeiro script, lê e grava arquivos com módulos padrão e cria um pequeno servidor HTTP que responde em JSON.
Todos os exemplos aqui foram executados com Node.js e a saída mostrada é real.
O que você precisa
- Node.js 18 ou mais recente (verifique com `node --version`)
- Um editor de texto, como o VS Code
Como funciona
Seu primeiro script
Crie `ola.js` e execute com `node ola.js`:
console.log("Olá, Node.js");
Módulos, leitura e gravação de arquivos
O Node.js já inclui módulos padrão, como `fs` para arquivos e `path` para caminhos. Este exemplo grava um arquivo JSON e depois o lê de volta.
const http = require("http");
const path = require("path");
const fs = require("fs");
// módulos e funções
function conceito(nota) {
if (nota >= 80) return "A";
if (nota >= 70) return "B";
if (nota >= 50) return "C";
return "F";
}
const alunos = [
{ name: "Budi", score: 85 },
{ name: "Siti", score: 72 },
{ name: "Andi", score: 45 },
];
// grava um arquivo e depois o lê de volta
const file = path.join(__dirname, "notas.json");
fs.writeFileSync(file, JSON.stringify(alunos.map(s => ({ ...s, grade: conceito(s.score) })), null, 2));
const data = JSON.parse(fs.readFileSync(file, "utf8"));
console.log("Olá, Node.js", data.length, "pessoas");
console.log(data.map(d => `${d.name}: ${d.grade}`).join("\n"));
// pequeno servidor HTTP: responde com JSON e para após 1 resposta (para teste)
const server = http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
res.end(JSON.stringify({ message: "Olá do Node.js", count: data.length }));
server.close();
});
server.listen(3100, () => console.log("servidor escutando em http://localhost:3100"));
Saída real (execute o script e depois envie uma requisição com curl para `http://localhost:3100/`):
Olá, Node.js 3 pessoas
Budi: A
Siti: B
Andi: F
servidor escutando em http://localhost:3100
{"message":"Olá do Node.js","count":3}
Pontos importantes:
- `require` carrega um módulo, e `__dirname` é a pasta onde o script está.
- `fs.writeFileSync` e `fs.readFileSync` são síncronos e esperam terminar. Isso não é problema em scripts pequenos, mas um servidor deve usar versões assíncronas, como `fs.promises.readFile`.
- A função passada para `http.createServer` é executada a cada requisição recebida.
Promises e async/await
Acessar arquivos de forma assíncrona permite que o programa continue funcionando enquanto espera. Este exemplo usa `async/await` para que o código seja lido em ordem:
const fs = require("fs/promises");
async function main() {
await fs.writeFile("anotacao.txt", "Anotação do Node.js");
const text = await fs.readFile("anotacao.txt", "utf8");
console.log("Lido:", text);
}
main().catch(err => console.error("Ocorreu um erro:", err.message));
Erros comuns
- **Porta já em uso:** troque o número da porta, ou encerre o programa que está usando.
- **Esquecer o `await` em uma Promise:** você recebe a própria Promise, e não o resultado.
- **Usar `require` em arquivo ES Module sem configuração:** verifique o tipo de módulo no `package.json`.
- **Não tratar erros:** use `try/catch` ou `.catch` para que o programa informe a causa.
Próximos passos
Crie uma API que guarda uma lista de tarefas em um arquivo JSON, depois passe para o Express ou o Fastify, dois frameworks populares para Node.js.
Resumo
O Node.js leva o JavaScript para o servidor. Os módulos padrão cuidam de arquivos e rede, e o async/await mantém o código concorrente fácil de ler.