Middleware
Un "Middleware" è un pezzo di codice che può agire prima e/o dopo il handler della route. Possiamo ottenere l'oggetto req
prima dell'invio o manipolare l'oggetto res
dopo l'invio.
Base
L'utente può registrare un middleware utilizzando la funzione lotto.use()
o su ciascun metodo http come lotto.get
e così via.
// corrisponde a tutti i paths indipendentemente dal metodo
lotto.use(cors())
// specificando metodo, path e handler
lotto.post('/users', auth(), ({ res }) => res.status(201).text('created'))
// corrisponde a tutti i paths indipendentemente dal metodo
lotto.use(cors())
// specificando metodo, path e handler
lotto.post('/users', auth(), ({ res }) => res.status(201).text('created'))
In questo caso, due middleware verrebbero elaborati prima di eseguire il handler.
cors() -> auth() -> handler
cors() -> auth() -> handler
Middleware Multipli
È possibile anche utilizzare più middleware per una route.
...
lotto.post(
'/users',
[
({ next }) => {
console.log('middleware 1')
next()
},
({ next }) => {
console.log('middleware 2')
next()
},
],
({ res }) => res.status(201).text('created'))
...
...
lotto.post(
'/users',
[
({ next }) => {
console.log('middleware 1')
next()
},
({ next }) => {
console.log('middleware 2')
next()
},
],
({ res }) => res.status(201).text('created'))
...
Ordine di Esecuzione
Come detto all'inizio di questa pagina i middleware possono essere eseguiti prima e/o dopo una richiesta, vediamo come funziona.
import { Lotto } from '@lottojs/lotto'
const lotto = new Lotto()
lotto.use(({ next }) => {
console.log('middleware 1 start')
next()
console.log('middleware 1 end')
})
lotto.get('/ping', ({ res }) => {
return res.text('Hello World!')
})
import { Lotto } from '@lottojs/lotto'
const lotto = new Lotto()
lotto.use(({ next }) => {
console.log('middleware 1 start')
next()
console.log('middleware 1 end')
})
lotto.get('/ping', ({ res }) => {
return res.text('Hello World!')
})
Quale risultato pensi che verrà stampato? Vediamo:
middleware 1 start
Hello World!
middleware 1 end
middleware 1 start
Hello World!
middleware 1 end
Built-in Middleware
Lotto
ha alcuni built-in middlewares come @lottojs/cors e @lottojs/secure-headers e puoi usalo, semplicemente facendo questo:
import { cors } from '@lottojs/cors'
...
// senza path
lotto.use(cors())
// con path e handler
lotto.get('/users', cors(), ({ res }) => res.status(200).text('user route'))
...
import { cors } from '@lottojs/cors'
...
// senza path
lotto.use(cors())
// con path e handler
lotto.get('/users', cors(), ({ res }) => res.status(200).text('user route'))
...
Middleware personalizzato
Se non abbiamo il middleware di cui hai bisogno o se vuoi semplicemente scriverne uno, è assolutamente possibile.
Ricorda solo che un middleware nel framework Lotto
sarà sempre una funzione di callback che riceve l'oggetto ctx
come parametro.
...
// Middleware generale
lotto.use(({ next }) => {
console.log('my custom middleware')
next();
})
// Middleware specifico per route
lotto.get(
'/users',
({ next } => {
console.log('my custom middleware')
}),
({ res }) => res.status(200).text('user route'))
...
...
// Middleware generale
lotto.use(({ next }) => {
console.log('my custom middleware')
next();
})
// Middleware specifico per route
lotto.get(
'/users',
({ next } => {
console.log('my custom middleware')
}),
({ res }) => res.status(200).text('user route'))
...
Third-party Middlewares
È possibile utilizzare middleware di terze parti ma ricorda sempre, i nostri built-in middlewares non dipendono da moduli esterni, ma quando aggiungi middleware di terze parti la tua applicazione inizierà a essere più complessa e forse con essi potrebbe anche essere necessario installare delle altre librerie.