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()
que pode receber um objectcontext
e uma funçãonext()
. Esse não pode ser a exportação padrão (export default
). -
Dentro de qualquer arquivo
.astro
, acesse os dados da resposta utilizandoAstro.locals
.
O object context
Seção intitulada O object contextO object context
inclui informações que serão disponibilizadas para outros middlewares, rotas de API e rotas .astro
durante o processo de renderização.
Esse é um argumento opcional passado para onRequest()
que pode contar o objecto locals
assim como propriedades adicionais a serem compartilhadas durante a renderização. Por exemplo, o objecto context
pode incluir cookies utilizados para autenticação.
Armazenando informações em context.locals
Seção intitulada Armazenando informações em context.localscontext.locals
é um objeto que pode ser manipulado dentro do middleware.
Esse objeto locals
é encaminhado através do processamento da chamada e é disponibilizado como um propriedade em APIContext
e AstroGlobal
. Isso permite que dados sejam compartilhados entre middlewares, rotas de API, e páginas .astro
. Isso é útil para armazenar dados específicos de uma chamada, como dados do usuário, entre processos de renderização.
Integrações pode definir propriedades e prover funcionalidades através do objeto locals
. Se você estiver utilizando uma integração, confira a documentação para garantir que você não está sobrescrevendo uma de suas propriedades or fazendo algum trabalho desnecessário.
Você pode armazenar dados de qualquer tipo dentro de 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
com Astro.locals
.
locals
é um objeto que vive e morre dentro de uma única rota AStro; quando a página de sua rota for renderizada, locals
não existirá mais e um novo será criado. Informação que precise persistir entre chamadas para múltiplas páginas devem ser armazenas em outro lugar.
O valor de locals
não pode ser sobrescrito em tempo de execução. Fazer isso arriscaria apagar todas as informações armazenadas pelo usuário. Em modo dev
, Astro valida e emite um erro se locals
for sobrescrito.
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:
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.
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:
Learn