Roteamento no Express com Node.js
Ao lidar com solicitações, o framework Express baseia-se em um sistema de roteamento. Na aplicação, definem-se as rotas e seus respectivos manipuladores. Se a solicitação corresponder a uma determinada rota, o manipulador correspondente é chamado para processar a solicitação.
Para tratar dados em uma rota específica, é possível usar várias funções, como:
- use
- get
- post
- put
- delete
Como primeiro parâmetro, essas funções podem aceitar um padrão de endereço para o qual a solicitação será processada. O segundo parâmetro das funções é a função que vai processar a solicitação que corresponde ao padrão de endereço. Por exemplo:
const express = require("express");
const app = express();
// Processamento da solicitação no endereço /about
app.get("/about", function (_, response) {
  response.send("<h1>Sobre o site</h1>");
});
// Processamento da solicitação no endereço /contact
app.use("/contact", function (_, response) {
  response.send("<h1>Contatos</h1>");
});
// Processamento da solicitação na raiz do site
app.get("/", function (_, response) {
  response.send("<h1>Página Principal</h1>");
});
app.listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));Quando uma solicitação chega, o Express compara o endereço solicitado com cada uma das rotas. Em seguida, seleciona a primeira rota correspondente. Quando a rota coincide, a função manipuladora dela é chamada.
Caracteres Curinga
Os padrões de endereço utilizados podem conter expressões regulares ou caracteres curinga especiais. Em particular, podemos usar símbolos como ?, +, * e ().
Por exemplo, o símbolo ? indica que o caractere anterior pode aparecer uma vez ou estar ausente. Podemos definir a seguinte função:
app.get("/bo?k", function (request, response) {
  response.send(request.url);
});Essa rota corresponderá à string de solicitação /bk ou /bok.
O símbolo + indica que o caractere anterior pode aparecer uma ou mais vezes:
app.get("/bo+k", function (request, response) {
  response.send(request.url);
});Essa rota corresponderá às solicitações /bok, /book, /boook e assim por diante.
O símbolo * indica que qualquer número de caracteres pode estar no lugar do símbolo:
app.get("/bo*k", function (request, response) {
  response.send(request.url);
});Essa rota corresponderá às solicitações /bork, /bonk, /bor.dak, /bor/ok e assim por diante.
Os parênteses () permitem agrupar caracteres que podem estar presentes na solicitação:
app.get("/book(.html)?", function (request, response) {
  response.send(request.url);
});A expressão (.html)? indica que a substring .html pode estar presente ou ausente na string de solicitação. Essa rota corresponderá às solicitações /book e /book.html.
Além de definir rotas, podemos usar expressões regulares. Por exemplo, para capturar todas as solicitações a arquivos HTML ou todos os caminhos que terminam com .html:
app.get(/.*(\.)html$/, function (request, response) {
  response.send(request.url);
});