Middleware
Um Middleware
é um pedaço de código que pode agir antes e/ou depois do handler de rota. Podemos obter o objeto req
antes de ser despachado ou manipular o objeto res
após o despacho.
Básico
O usuário pode registrar um middleware usando a função lotto.use()
ou em cada método de rota junto com o caminho da rota e o handler como lotto.get
e assim por diante.
// corresponde a todas as rotas independente do método
lotto.use(cors())
// especificando método, caminho e handler
lotto.post('/users', auth(), ({ res }) => res.status(201).text('created'))
// corresponde a todas as rotas independente do método
lotto.use(cors())
// especificando método, caminho e handler
lotto.post('/users', auth(), ({ res }) => res.status(201).text('created'))
Neste caso, dois middlewares seriam processados antes de executar o handler.
cors() -> auth() -> handler
cors() -> auth() -> handler
Middlewares Múltiplos
Também é possível usar vários middlewares em uma rota.
...
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'))
...
Ordem de execução
Como dito no início desta página os middlewares podem ser executados antes e/ou depois de uma requisição, vamos ver como funciona.
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!')
})
Qual resultado você acha que será impresso? Vamos ver:
middleware 1 start
Hello World!
middleware 1 end
middleware 1 start
Hello World!
middleware 1 end
Built-in Middleware
Lotto
tem alguns built-in middlewares como @lottojs/cors e @lottojs/secure-headers e você pode usá-los, apenas fazendo isso:
import { cors } from '@lottojs/cors'
...
// sem passar um caminho
lotto.use(cors())
// passasndo caminho, método e handler
lotto.get('/users', cors(), ({ res }) => res.status(200).text('user route'))
...
import { cors } from '@lottojs/cors'
...
// sem passar um caminho
lotto.use(cors())
// passasndo caminho, método e handler
lotto.get('/users', cors(), ({ res }) => res.status(200).text('user route'))
...
Middleware Customizado
Se não tivermos o middleware que você precisa ou se quiser apenas escrever um, é totalmente possível.
Basta lembrar que um middleware no framework Lotto
sempre será um callback que recebe o objeto ctx
como parâmetro.
...
// Middleware geral
lotto.use(({ next }) => {
console.log('my custom middleware')
next();
})
// Middleware espcífico por rota
lotto.get(
'/users',
({ next } => {
console.log('my custom middleware')
}),
({ res }) => res.status(200).text('user route'))
...
...
// Middleware geral
lotto.use(({ next }) => {
console.log('my custom middleware')
next();
})
// Middleware espcífico por rota
lotto.get(
'/users',
({ next } => {
console.log('my custom middleware')
}),
({ res }) => res.status(200).text('user route'))
...
Third-party Middlewares
É possível usar middlewares de terceiros, mas lembre-se sempre, nossos built-in middlewares não dependem de módulos externos, mas ao adicionar middlewares de terceiros sua aplicação começaria a ficar mais complexa e talvez com eles também pudesse ser necessário instalar outras bibliotecas.