Tutorial de Express.js: crie um servidor Node passo a passo
Tutorial de Express.js
Tutorial de Express.js: rotas, middleware, JSON, Express 5 | We.Inc
Crie um servidor Express 5 passo a passo: rotas, middleware, corpos JSON, arquivos estáticos e um tratador de erros, mais um gerador de servidor inicial e as mudanças da v4 para a v5.
Express é um framework web pequeno para Node.js. Instale com npm install express, crie um app com express(), adicione rotas como app.get('/', handler) e inicie com app.listen(3000). Middleware como express.json() roda antes das suas rotas, e um tratador de erros com quatro argumentos vem por último.
A maioria dos tutoriais de Express ainda mostra código da versão 4 que quebra ou gera avisos na versão 5, que agora é a instalada por padrão. Este passo a passo usa Express 5 do início ao fim, gera um servidor inicial com as partes que você marcar e termina com uma tabela das mudanças que costumam pegar as pessoas ao atualizar um projeto antigo.
Marque no gerador os recursos que você quer: corpos JSON, arquivos estáticos, um router, uma página 404 e um tratador de erros.
Escolha ES modules ou CommonJS conforme o seu package.json.
Copie o arquivo para index.js, rode npm install express e depois node index.js.
Leia as seções abaixo para entender o que cada parte faz e como a versão 5 difere da 4.
A ordem importa: o Express roda middleware e rotas na ordem em que você os registra, então os parsers de corpo vêm primeiro e o tratador de erros vem por último.
No Express 5, uma rota async que lança um erro ou é rejeitada é passada automaticamente para o seu tratador de erros. Você não precisa mais de um wrapper em volta de cada função async.
Use path.join(__dirname, 'public') ou um caminho absoluto para os arquivos estáticos, para que o servidor funcione a partir de qualquer pasta em que você o inicie.
Defina NODE_ENV=production em produção. Assim o tratador de erros embutido para de enviar stack traces aos visitantes.
Perguntas frequentes
Qual versão do Node.js o Express 5 exige?
O Express 5 exige Node.js 18 ou mais recente. Se você está preso a um Node mais antigo, fique no Express 4 até poder atualizar o runtime.
Por que req.body está undefined?
Nenhum parser de corpo rodou para essa requisição. Adicione app.use(express.json()) para JSON ou express.urlencoded() para envios de formulário antes das suas rotas, e garanta que o cliente envie um header Content-Type correspondente. No Express 5, um corpo não processado é undefined, e não um objeto vazio.
Como escrevo uma rota curinga no Express 5?
Agora os curingas precisam ter nome. Use app.get('/*splat', handler) em vez de '/*'. Para também cobrir o caminho raiz, envolva em chaves: '/{*splat}'.
O que o next() faz?
Ele passa a requisição para o próximo middleware ou rota que corresponder. Chame next() para continuar, next(err) para pular para os tratadores de erros, ou envie uma resposta para encerrar a cadeia. Esquecer as duas coisas deixa a requisição pendurada.
Ainda devo usar o body-parser?
Não para JSON e dados de formulário. express.json() e express.urlencoded() já vêm embutidos. Observe que no Express 5 a opção extended do parser urlencoded é false por padrão.
Rotas e parâmetros
Uma rota é um método, um caminho e um handler. Segmentos nomeados como :id são lidos de req.params, query strings de req.query e o corpo processado de req.body.
Responda com res.json() para dados, res.send() para texto ou HTML, e res.status(404) encadeado antes de qualquer um para definir o código. O Express 5 aceita em res.status() só números inteiros de 100 a 999.
Middleware em um parágrafo
Middleware é uma função de req, res e next que roda antes do handler da rota. Ela pode ler ou alterar a requisição, encerrar a resposta ou chamar next(). Logs, verificações de autenticação, headers de CORS e processamento do corpo são todos middleware, montados com app.use() para todos os caminhos ou passados para uma única rota.
Configure um projeto
Instalar e rodar
Crie uma pasta, inicialize o package.json, marque-o como um projeto de ES modules e instale o Express.
Rotas em um arquivo próprio
Um router é um mini app. Monte-o sob um prefixo para que todo caminho dentro dele seja relativo a esse prefixo.
Erros async chegam ao tratador de erros
No Express 5, uma promise rejeitada em uma rota é encaminhada para você. O handler de quatro argumentos, registrado por último, a transforma em uma resposta.
Do Express 4 para o 5: o que mudou
O Express oferece codemods para muitas destas mudanças: npx codemod@latest @expressjs/v5-migration-recipe.