Middleware
本頁內容尚未翻譯。
Middleware allows you to intercept requests and responses and inject behaviors dynamically every time a page or endpoint is about to be rendered. This rendering occurs at build time for all prerendered pages, but occurs when the route is requested for pages rendered on demand.
Middleware also allows you to set and share request-specific information across endpoints and pages by mutating a locals
object that is available in all Astro components and API endpoints. This object is available even when this middleware runs at build time.
Basic Usage
Section titled Basic Usage-
Create
src/middleware.js|ts
(Alternatively, you can createsrc/middleware/index.js|ts
.) -
Inside this file, export an
onRequest()
function that can be passed acontext
object andnext()
function. This must not be a default export. -
Inside any
.astro
file, access response data usingAstro.locals
.
The context
object
Section titled The context objectThe context
object includes information to be made available to other middleware, API routes and .astro
routes during the rendering process.
This is an optional argument passed to onRequest()
that may contain the locals
object as well as any additional properties to be shared during rendering. For example, the context
object may include cookies used in authentication.
Storing data in context.locals
Section titled Storing data in context.localscontext.locals
is an object that can be manipulated inside the middleware.
This locals
object is forwarded across the request handling process and is available as a property to APIContext
and AstroGlobal
. This allows data to be shared between middlewares, API routes, and .astro
pages. This is useful for storing request-specific data, such as user data, across the rendering step.
Integrations may set properties and provide functionality through the locals
object. If you are using an integration, check its documentation to ensure you are not overriding any of its properties or doing unnecessary work.
You can store any type of data inside locals
: strings, numbers, and even complex data types such as functions and maps.
Then you can use this information inside any .astro
file with Astro.locals
.
locals
is an object that lives and dies within a single Astro route; when your route page is rendered, locals
won’t exist anymore and a new one will be created. Information that needs to persist across multiple page requests must be stored elsewhere.
The value of locals
cannot be overridden at run time. Doing so would risk wiping out all the information stored by the user. In dev
mode, Astro performs checks and will throw an error if locals
are overridden.
Example: redacting sensitive information
Section titled Example: redacting sensitive informationThe example below uses middleware to replace “PRIVATE INFO” with the word “REDACTED” to allow you to render modified HTML on your page:
Middleware types
Section titled Middleware typesYou can import and use the utility function defineMiddleware()
to take advantage of type safety:
Instead, if you’re using JsDoc to take advantage of type safety, you can use MiddlewareHandler
:
To type the information inside Astro.locals
, which gives you autocompletion inside .astro
files and middleware code, declare a global namespace in the env.d.ts
file:
Then, inside the middleware file, you can take advantage of autocompletion and type safety.
Chaining middleware
Section titled Chaining middlewareMultiple middlewares can be joined in a specified order using sequence()
:
This will result in the following console order:
Error pages
Section titled Error pagesMiddleware will attempt to run for all on-demand rendered pages, even when a matching route cannot be found. This includes Astro’s default (blank) 404 page and any custom 404 pages. However, it is up to the adapter to decide whether that code runs. Some adapters may serve a platform-specific error page instead.
Middleware will also attempt to run before serving a 500 error page, including a custom 500 page, unless the server error occured in the execution of the middleware itself. If your middleware does not run successfully, then you will not have access to Astro.locals
to render your 500 page.