Tag: express, nodejs, backend, middleware, routing, javascript
Livello: intermedio
TL;DR: Framework web minimalista per Node.js. Gestisce routing HTTP e middleware per elaborare rapidamente le richieste e creare API REST.
-
Standard de facto per applicazioni web e API RESTful in Node.js.
-
Architettura unopinionated, lascia totale libertà organizzativa al team.
-
Routing basato su metodi HTTP (GET, POST, PUT, DELETE, ecc.) e pattern di percorsi.
-
I middleware sono funzioni sequenziali che accedono all'oggetto richiesta (req), risposta (res) e alla callback next().
-
L'oggetto Router (creato con express.Router()) serve a modularizzare e incapsulare gruppi di route.
-
req.params estrae variabili dalla route (es. /users/:id), req.query i dati dalla query string.
-
I middleware integrati express.json() e express.urlencoded() effettuano il parsing del body delle richieste HTTP.
-
I middleware di gestione degli errori hanno la firma specifica a quattro argomenti: (err, req, res, next).
-
Q: Qual e' la differenza tra req.params, req.query e req.body?R: req.params legge le variabili definite nel path, req.query estrae quelle presenti nell'URL dopo il punto interrogativo, req.body contiene il payload inviato (spesso in POST/PUT).
-
Q: Cos'e' un middleware e a cosa serve?R: È un blocco di codice che si frappone nel ciclo richiesta/risposta. Lo uso per controlli di autenticazione, logging o parsing dati. Deve restituire una risposta o chiamare next().
-
Q: Come si gestiscono le eccezioni e gli errori?R: Passo l'errore chiamando next(err) e definisco un middleware di errore (con 4 parametri) alla fine della catena app.use() per centralizzare la gestione dei crash.
-
Dimenticare di chiamare next() all'interno di un middleware, lasciando la richiesta in sospeso fino al timeout.
-
Inviare più volte la risposta al client (es. usando due res.json()), generando l'errore "Cannot set headers after they are sent to the client".
-
Posizionare i middleware di gestione errori in cima al file principale invece che in fondo (devono catturare ciò che le route falliscono).
-
Omettere il catch block nelle chiamate asincrone, perdendo il tracciamento delle promise rifiutate (Express 5.x risolve nativamente questo problema).
```const express = require('express');
const app = express();
// Middleware per parser del JSON
app.use(express.json());
// Esempio base router
const apiRouter = express.Router();
apiRouter.post('/auth', (req, res) => {
const { user } = req.body;
res.status(200).json({ auth: true, user });
});
// Montaggio router
app.use('/api', apiRouter);
// Middleware di error handling globale
app.use((err, req, res, next) => {
console.error(err.message);
res.status(err.status || 500).json({ error: 'Internal Server Error' });
});
app.listen(3000, () => console.log('Listening on port 3000'));
```
-
[ ] Pattern architetturali Controller-Service-Repository integrati nei file di route.
-
[ ] Tipizzazione stretta TypeScript per Request e Response personalizzati (estensione delle interfacce base).
-
Documentazione ufficiale Express (expressjs.com)