Middleware
Middleware lhe permite interceptar requisições e respostas e injetar comportamentos dinamicamente toda vez que uma página ou endpoint for ser renderizado.
Isso também permite definir e compartilhar informações específicas da requisição entre endpoints e páginas alterando o objeto locals
que é disponibilizado em todos os componentes Astro e endpoints de API.
Middleware está disponível tanto para projetos Astro SSG quanto SSR.
Uso Básico
Seção intitulada Uso Básico-
Crie um arquivo
src/middleware.js|ts
(Como alternativa, você pode criarsrc/middleware/index.js|ts
.) -
Dentro deste arquivo, exporte uma função
onRequest()
. Esta exportação não pode ser um default export. -
Dentro de qualquer arquivo
.astro
, acesse os dados da resposta utilizandoAstro.locals
.
Tipos do Middleware
Seção intitulada Tipos do MiddlewareVocê pode importar e utilizar a função utilitária defineMiddleware()
para se aproveitar da segurança de tipo:
De outra forma, se você estiver utilizando JsDoc para se aproveitar da segurança de tipo, você pode utilizar MiddlewareRequestHandler
:
Para tipar a informação dentro de Astro.locals
, o que lhe fornece preenchimento automático dentro de arquivos .astro
e do código do middleware,
declare um namespace global no arquivo env.d.ts
:
Então, dentro do arquivo do middleware, podemos nos aproveitar de preenchimento automático e segurança de tipos.
Você pode armazenar dados de qualquer tipo dentro de Astro.locals
: strings, numbers, e até mesmo tipos complexos como funções e maps.
Desta forma você pode utilizar essas informações dentro de qualquer arquivo .astro
.
Exemplo: editando informações sensíveis
Seção intitulada Exemplo: editando informações sensíveisO exemplo abaixo utiliza middleware para substituir “INFORMAÇÃO PESSOAL” pela palavra “REMOVIDO” para lhe permitir renderizar HTML modificado na sua página:
Encadeando middleware
Seção intitulada Encadeando middlewareMúltiplos middlewares podem ser conectados em uma sequência ordenada utilizando sequence()
:
O exemplo acima resultará na seguinte ordem no terminal:
Referência da API
Seção intitulada Referência da APIonRequest()
Seção intitulada onRequest()Uma função exportada obrigatória do arquivo src/middleware.js
que será chamada antes da renderização de cada página ou rota da API.
Ela aceita dois argumentos opcionais: context e next().
onRequest()
deve retornar uma Response
: ou diretamente, ou chamando next()
.
context
Seção intitulada contextUm objeto que inclui informações a serem disponibilizadas para outro middleware, rotas de API e rotas .astro
durante o processo de renderização.
Esse é um argumento opcional passado para onRequest()
que pode conter o objeto locals
junto com qualquer propriedade adicional a ser compartilhada durante a renderização.
Por exemplo, o objeto context
pode incluir cookies utilizados para autenticação.
Esse é o mesmo objeto context
que é passada para as rotas de API.
next()
Seção intitulada next()Uma função que intercepta (lê e modifica) a resposta (Response
) de uma requisição (Request
) ou invoca o próximo middleware na sequência e retorna uma Response
.
Por exemplo, essa função pode modificar o corpo HTML de uma resposta.
Esse é um argumento opcional de onRequest()
, e pode prover a Response
que o middleware deve retornar.
locals
Seção intitulada localsUm objeto contendo dados de uma Response
que podem ser manipulados dentro do middleware.
Esse objeto locals
é repassado através do processo de manipulação da requisição e é diponibilizado como uma propriedade em APIContext
e AstroGlobal
.
Isso permite que dados sejam compartilados entre middlewares, rotas da API, e páginas .astro
. Isso é útil para armazenar dados específicos de uma chamada, como dados do usuário, através das etapas de renderização.
locals
é um objeto que vive e morre dentro de uma única rota Astro; quando a página da sua rota for renderizada, locals
deixará de existir e um novo objeto será criado.
Informações que precisarem ser persistidas através de múltiplas páginas devem ser armazenadas em outro lugar.
O valor de locals
não pode ser sobrescrito tem tempo de execução. Fazer isso causaria um risco descartar toda a informação armazenada pelo usuário. Em modo de desenvolvimento (dev
), Astro executa validações e emitirá um erro se locals
for sobrescrito.
sequence()
Seção intitulada sequence()Uma função que aceita funções de middleware como argumentos, e os executará na ordem que foram passados.
createContext
Seção intitulada createContextUma API de baixo nível para criar um APIContext
que pode ser utilizado pelo middleware Astro.
Essa função pode ser usada por integrações/adaptadores para executar programaticamente os middlewares Astro.
trySerializeLocals
Seção intitulada trySerializeLocalsUma API de baixo nível que recebe qualquer valor e tenta retornar uma versão serializada (uma string) desse valor. Se o valor não puder ser serializado, essa função irá lançar um erro de runtime.
Learn