# Parte 2: Introduzione ai Middleware

Benvenuti alla nostra lezione su middleware in Node.js utilizzando il framework Express.

I middleware sono funzioni che hanno accesso agli oggetti di richiesta (request), risposta (response), e alla prossima funzione middleware nel ciclo di richiesta-risposta dell'applicazione. Sono uno strumento essenziale per effettuare il preprocessing delle richieste, gestire le risposte, e organizzare il codice in maniera modulare.

## Cosa è un Middleware?

Un middleware è una funzione che viene eseguita tra la ricezione della richiesta e l'invio della risposta nel tuo application server. Questi possono eseguire le seguenti operazioni:

* Eseguire qualsiasi codice.
* Modificare gli oggetti di richiesta e risposta.
* Terminare il ciclo di richiesta-risposta.
* Chiamare il prossimo middleware nella pila.

Se il middleware non termina il ciclo di richiesta-risposta, deve chiamare `next()` per passare il controllo al prossimo middleware, altrimenti la richiesta rimarrà sospesa.

## Implementare Middleware Base in Express

Express è un framework che rende molto semplice implementare middleware. Qui vediamo come aggiungere un middleware semplice che registra la data e l'ora di ogni richiesta.

1. **Crea un file `app.js`**: Inizia creando un nuovo progetto Express se non l'hai già fatto:

   ```bash
   mkdir mioProgettoExpress
   cd mioProgettoExpress
   npm init -y
   npm install express
   touch app.js
   ```
2. **Aggiungi il Middleware per il Logging**: Nel file `app.js`, configura il tuo server Express e aggiungi un middleware che stampa la data e l'ora attuali:

   ```javascript
   const express = require('express');
   const app = express();
   const port = 3000;

   // Middleware che logga la data e l'ora delle richieste
   app.use((req, res, next) => {
     console.log('Time:', Date.now());
     next();
   });

   app.get('/', (req, res) => {
     res.send('Home Page');
   });

   app.get('/about', (req, res) => {
     res.send('About Page');
   });

   app.listen(port, () => {
     console.log(`Server running on http://localhost:${port}`);
   });
   ```

## Middleware per la Gestione degli Errori

I middleware non sono utili solo per loggare o modificare le richieste; possono anche gestire gli errori. Express ha una particolarità: i middleware che gestiscono gli errori hanno quattro argomenti invece di tre. L'argomento aggiuntivo è l'errore che viene passato.

```javascript
// Middleware per la gestione degli errori
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});
```

## Esercizio: Creazione di Middleware Personalizzato

Prova a creare un middleware che controlla se una richiesta contiene un certo header, e se non è presente, invia una risposta con status 400 (Bad Request). Questo esercizio ti aiuterà a comprendere come i middleware possono essere usati per validare le richieste in ingresso.

```javascript
app.use((req, res, next) => {
  if (!req.headers['x-custom-header']) {
    res.status(400).send('Bad Request: Missing x-custom-header');
  } else {
    next();
  }
});
```

## Conclusione

Con questa lezione, hai imparato cos'è un middleware, come implementarlo in un'applicazione Express, e come può essere utilizzato per migliorare la gestione delle richieste e delle risposte. I middleware sono potenti strumenti per costruire applicazioni web robuste e sicure.

Continua a esplorare e a sperimentare con i middleware in Express per scoprire come possono migliorare ulteriormente le tue applicazioni!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.ziomark.xyz/javascript/express.js/parte-2-introduzione-ai-middleware.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
