Middlewares
Criando Middlewares
Pra criar uma classe middleware, basta estender ProtonMiddleware
. Um middleware poderá ter um Middleware Function.
Exemplo:
import { Middleware, MiddlewareFunctionParams, ProtonMiddleware } from 'protontype'; export class ExampleMiddleware extends ProtonMiddleware { @Middleware() exampleMiddlewareFunc(params: MiddlewareFunctionParams) { cosole.log(params.req); console.log(params.res); params.next(); } }
Middleware Function
Um Middleware Function é uma função dentro de uma classe ProtonMiddleware
anotada com o decorator @Middleware
e tem como parâmetro um objeto do tipo MiddlewareFunctionParams
. Esta função define o comportamento do middleware.
@Middleware() exampleMiddlewareFunc(params: MiddlewareFunctionParams) { cosole.log(params.req); console.log(params.res); params.next(); }
O decorator @Middleware
possui o parâmetro opcional autoNext: boolean
. Caso seja true
a função next()
será implicitamente chamada no final da função, não sendo necessário chamar explicitamente params.next()
.
Exemplo:
@Middleware(true) exampleMiddlewareFunc(params: MiddlewareFunctionParams) { cosole.log(params.req); console.log(params.res); }
@Middleware
O decorator @Middleware()
indica qual função contém o comportamento do middleware.
Propriedades
- autoNext:
boolean
. Habilita a chamada implícita da funçãonext()
no final da execução do middleware
MiddlewareFunctionParams
Parâmetros de um Middleware Function
Propriedades
- req: Objeto que contém a requisição http. Corresponde ao objeto de request do Express.
- res: Objeto usado para enviar a resposta http. Corresponde ao objeto de response do Express.
- next: função usada para chamar o próximo middleware da cadeia
- app: Instância da aplicação Protontype. Por meio dela pode-se acessar as propriedades da aplicação.
Escopo dos Middlewares
Os middlewares podem atuar em diferentes escopos
Escopo de Aplicação
Este middleware atuará no escopo da global, ou seja, antes de qualquer rota configurada.
Para tornar um middleware global, deve-se adicionar ele no bootstrap da aplicação usando os métodos addMiddleware ou addMiddlewareAs
:
new ProtonApplication() .addMiddleware(new ExampleMiddleware()) .addMiddlewareAs(ExampleMiddleware2) .start();
- addMiddleware: Permite passar uma instância criada do middleware
- addMiddlewareAs: Permite passar o tipo do middleware para ser instanciado pela aplicação
Escopo de Router
Este middleware atuará para todas as Router Functions dentro de uma classe ExpressRouter
.
Para adicionar middlewares para atuar no escopo do router, este deve ser configurado no decorator @RouterClass()
:
@RouterClass({ baseUrl: "/tasks", middlewares: [ new ExampleMiddleware(), new ExampleMiddleware2() ] }) export class TaskRouter extends ExpressRouter { ... }
Escopo de Rota (Router Function)
Este middleware atuará somente para aquela rota específica. Para adicionar middlewares ao escopo da rota, este deve ser configurado no decorator @Route()
:
@RouterClass({baseUrl: "/tasks"}) export class TaskRouter extends ExpressRouter { @Route({ endpoint: '/', method: Method.GET, middlewares: [ new ExampleMiddleware(), new ExampleMiddleware2() ] }) listTask(params: RouterFunctionParams) { ... } }
Hook Methods
O método configMiddlewares()
pode ser sobrescrito. Nele podemos acessar a instância do express e fazer qualquer configuração ou lógica necessária.
Exemplo:
export class DefaultMiddleware extends Middleware { private port: number = 5555; private jsonSpaces: number = 2; public configMiddlewares(): void { this.express.set("port", this.port); this.express.set("json spaces", this.jsonSpaces); this.express.use(bodyParser.json()); this.express.use((req, res, next) => { delete req.body.id; next(); }) }