@@ -16,109 +16,262 @@ import ReadMore from '~/components/ReadMore.astro';
1616
1717## 从 ` astro:middleware ` 导入
1818
19+ 以下辅助函数从虚拟中间件模块导入:
20+
1921``` js
2022import {
21- sequence ,
22- createContext ,
23- trySerializeLocals ,
2423 defineMiddleware ,
25- } from ' astro:middleware' ;
24+ sequence ,
25+ } from ' astro:middleware' ;
2626```
2727
2828### ` defineMiddleware() `
2929
30- 你可以导入并使用 ` defineMiddleware() ` 实用函数来提供类型安全:
30+ <p >
31+
32+ ** 类型:** <code >(fn: <a href = " #middlewarehandler" >MiddlewareHandler</a >) => MiddlewareHandler</code >
33+ </p >
34+
35+ 一个用于定义具有类型安全的中间件函数的函数。当你使用此实用函数时,[ ` context ` ] ( #context ) 和 [ ` next() ` ] ( #next ) 参数会自动被类型化,如果你尝试返回一个 [ 不支持的值] ( #middlewarehandler ) ,你将会收到 TypeScript 错误。
3136
32- ``` ts
33- // src/middleware.ts
37+ ``` ts title="src/middleware.ts"
3438import { defineMiddleware } from " astro:middleware" ;
3539
36- // `context` 和 `next` 会自动被类型化
3740export const onRequest = defineMiddleware ((context , next ) => {
38-
41+ /* 你的中间件逻辑 */
3942});
4043```
4144
4245### ` sequence() `
4346
4447<p >
4548
46- ** 类型:** ` (...handlers: MiddlewareHandler[]) => MiddlewareHandler `
49+ ** 类型:** < code > (...handlers: < a href = " #middlewarehandler " > MiddlewareHandler</ a > [ ] ) => MiddlewareHandler</ code >
4750</p >
4851
4952一个接受中间件函数作为参数的函数,它将按照它们传递的顺序执行它们。
5053
5154``` js title="src/middleware.js"
5255import { sequence } from " astro:middleware" ;
5356
54- async function validation (_ , next ) {... }
55- async function auth (_ , next ) {... }
56- async function greeting (_ , next ) {... }
57+ async function validation (context , next ) {/* ... */ }
58+ async function auth (context , next ) {/* ... */ }
59+ async function greeting (context , next ) {/* ... */ }
5760
5861export const onRequest = sequence (validation, auth, greeting);
5962```
6063
64+ ## 从 ` astro/middleware ` 导入
65+
66+ 当你构建 [ Astro 集成] ( /zh-cn/reference/integrations-reference/ ) 时,可以从常规中间件模块导入以下辅助函数:
67+
68+ ``` js
69+ import {
70+ createContext ,
71+ defineMiddleware ,
72+ sequence ,
73+ trySerializeLocals ,
74+ } from " astro/middleware" ;
75+ ```
76+
6177### ` createContext() `
6278
6379<p >
6480
65- ** 类型:** ` (context: CreateContext) => APIContext ` <br />
81+ ** 类型:** < code > (context: < a href = " #createcontext-1 " > CreateContext</ a > ) => < a href = " /zh-cn/reference/api-reference/ " > APIContext</ a ></ code > <br />
6682<Since v = " 2.8.0" />
6783</p >
6884
69- 一个底层 API,用于创建一个 [ ` APIContext ` ] ( /zh-cn/reference/api-reference/ ) 以传递给 Astro 中间件的 ` onRequest() ` 函数。
85+ 一个底层 API,用于创建一个 [ ` APIContext ` ] ( /zh-cn/reference/api-reference/ ) 以传递给 Astro 中间件的 [ ` onRequest() ` 函数] ( #onrequest ) 。
86+
87+ 此函数可以由集成/适配器用于以编程方式执行 Astro 中间件。
88+
89+ ### ` defineMiddleware() `
90+
91+ 请参考来自 ` astro:middleware ` 的 [ ` defineMiddleware() ` ] ( #definemiddleware ) 。
92+
93+ ### ` sequence() `
7094
71- 此函数可以由集成/适配器用于执行 Astro 中间件 。
95+ 请参考来自 ` astro:middleware ` 的 [ ` sequence() ` ] ( #sequence ) 。
7296
7397### ` trySerializeLocals() `
7498
7599<p >
76100
77- ** 类型:** ` (value: unknown) => string ` <br />
101+ ** 类型:** ` (value: unknown) => string ` <br />
78102<Since v = " 2.8.0" />
79103</p >
80104
81105一个底层 API,它接受任何值并尝试返回它的序列化版本(一个字符串)。如果该值无法序列化,该函数将抛出一个运行时错误。
82106
83- ## 中间件导出
107+ ## ` astro/middleware ` 类型
84108
85- 在 ` src/middleware.js ` 中定义项目的中间件时,导出以下用户定义的函数 :
109+ 以下类型从常规中间件模块导入 :
86110
87- ### ` onRequest() `
111+ ``` js
112+ import type {
113+ CreateContext ,
114+ } from " astro/middleware" ;
115+ ```
88116
89- ** 类型: ** ` (context: APIContext, next: MiddlewareNext) => Promise<Response> | Response | Promise<void> | void `
117+ ### ` CreateContext `
90118
91- 一个在 ` src/middleware.js ` 里的必须导出的函数,它将在每次渲染页面或端点时被调用。它接受两个参数: [ context ] ( #context ) 和 [ next() ] ( #next ) 。 ` onRequest() ` 必须返回一个 ` Response ` :要么直接返回,要么通过调用 ` next() ` 返回。
119+ < p >
92120
93- ``` js title="src/middleware.js"
94- export function onRequest (context , next ) {
95- // 拦截一个请求的响应数据
96- // 可选修改响应
97- // 直接返回一个 Response 对象,或者调用 `next()` 的结果
98- return next ();
121+ ** 类型:** ` { request: Request; params?: Params; userDefinedLocales?: string[]; defaultLocale: string; locals: App.Locals; } ` <br />
122+ <Since v = " 2.8.0" />
123+ </p >
124+
125+ 一个用于 [ 创建上下文] ( #createcontext ) 以传递给 Astro 中间件的对象。它包含以下属性:
126+
127+ #### ` request `
128+
129+ <p >
130+
131+ ** 类型:** ` Request `
132+ </p >
133+
134+ 传入的 [ ` Request ` ] ( https://developer.mozilla.org/en-US/docs/Web/API/Request ) 对象。
135+
136+ #### ` params `
137+
138+ <p >
139+
140+ ** 类型:** ` Params `
141+ </p >
142+
143+ 一个包含要传递给 [ ` Astro.params ` ] ( /zh-cn/reference/api-reference/#params ) 的可选参数的对象。
144+
145+ #### ` userDefinedLocales `
146+
147+ <p >
148+
149+ ** 类型:** ` string[] ` <br />
150+ <Since v = " 3.5.0" />
151+ </p >
152+
153+ 在 [ 用户的 ` i18n ` 配置] ( /zh-cn/reference/configuration-reference/#i18nlocales ) 中定义的支持语言环境列表。
154+
155+ #### ` defaultLocale `
156+
157+ <p >
158+
159+ ** 类型:** ` string ` <br />
160+ <Since v = " 4.16.0" />
161+ </p >
162+
163+ 在 [ 用户的 ` i18n ` 配置] ( /zh-cn/reference/configuration-reference/#i18ndefaultlocale ) 中定义的默认语言环境。
164+
165+ #### ` locals `
166+
167+ <p >
168+
169+ ** 类型:** ` App.Locals ` <br />
170+ <Since v = " 5.0.0" />
171+ </p >
172+
173+ 一个用于从中间件存储任意信息的对象,用户可以通过 [ ` Astro.locals ` ] ( /zh-cn/reference/api-reference/#locals ) 访问。
174+
175+ <ReadMore >了解更多关于 [ 在 ` locals ` 中存储数据] ( /zh-cn/guides/middleware/#在-contextlocals-中存储数据 ) 的示例用法。</ReadMore >
176+
177+ ## ` astro ` 类型
178+
179+ ``` js
180+ import type {
181+ MiddlewareHandler ,
182+ MiddlewareNext ,
183+ RewritePayload ,
184+ } from " astro" ;
185+ ```
186+
187+ ### ` MiddlewareHandler `
188+
189+ <p >
190+
191+ ** 类型:** <code >(context: <a href = " /zh-cn/reference/api-reference/" >APIContext</a >, next: <a href = " #middlewarenext" >MiddlewareNext</a >) => Promise\< Response\> | Response | Promise\< void\> | void</code >
192+ </p >
193+
194+ 表示一个 Astro 中间件函数。中间件处理程序接收两个参数,可以直接返回一个 ` Response ` ,或者调用 ` next() ` 来调用链中的下一个中间件。或者,你可以使用 [ ` defineMiddleware() ` ] ( #definemiddleware ) 来为你的中间件获得类型安全。
195+
196+ 以下示例导入 ` MiddlewareHandler ` 类型以在 [ ` onRequest() ` ] ( #onrequest ) 函数中获得类型安全:
197+
198+ ``` ts title="src/middleware.ts"
199+ import type { MiddlewareHandler } from " astro" ;
200+
201+ export const onRequest: MiddlewareHandler = (context , next ) => {
202+ /* 中间件逻辑 */
99203};
100204```
101205
102- 你的 ` onRequest() ` 函数将使用以下参数调用 :
206+ 中间件处理程序接收以下属性 :
103207
104208#### ` context `
105209
106210<p >
107211
108- ** 类型:** ` APIContext `
212+ ** 类型:** [ ` APIContext ` ] ( /zh-cn/reference/api-reference/ )
109213</p >
110214
111- ` onRequest() ` 的第一个参数是一个上下文对象。它反映了许多 ` Astro ` 全局属性。
112-
113- <ReadMore >有关更多信息,请参阅 [ 端点上下文] ( /zh-cn/reference/api-reference/ ) 。</ReadMore >
215+ 一个反映许多 ` Astro ` 全局属性的 [ Astro 上下文] ( /zh-cn/reference/api-reference/ ) 对象。
114216
115217#### ` next() `
116218
117219<p >
118220
119- ** 类型:** ` (rewritePayload?: string | URL | Request) => Promise<Response> ` <br />
221+ ** 类型:** [ ` MiddlewareNext ` ] ( #middlewarenext ) <br />
120222</p >
121223
122- ` onRequest() ` 的第二个参数是一个调用链中的所有后续中间件,并返回一个 ` Response ` 的函数。例如,其他中间件可以修改响应的 HTML 主体,等待 ` next() ` 的结果将允许你的中间件响应这些更改。
224+ 一个调用链中所有后续中间件并返回 ` Response ` 的函数。例如,其他中间件可以修改响应的 HTML 主体,等待 ` next() ` 的结果将允许你的中间件响应这些更改。
225+
226+ 自从 Astro v4.13.0 起,` next() ` 接受一个可选的 URL 路径参数,形式为字符串、` URL ` 或 ` Request ` ,用于[ 重写] ( /zh-cn/guides/routing/#重写 ) 当前请求而不重新触发新的渲染阶段。
227+
228+ 以下示例使用 ` next() ` 在当前路径匹配 ` /old-path ` 时提供来自不同路径的内容:
229+
230+ ``` ts title="src/middleware.ts"
231+ import type { MiddlewareHandler } from " astro" ;
123232
124- 自从 Astro v4.13.0,` next() ` 接受一个可选的 URL 路径参数,形式为字符串、` URL ` 或 ` Request ` ,用于[ 重写] ( /zh-cn/guides/routing/#重写 ) 当前请求而不重新触发新的渲染阶段。
233+ export const onRequest: MiddlewareHandler = (context , next ) => {
234+ if (context .url .pathname === ' /old-path' ) {
235+ return next (' /new-path' );
236+ }
237+ return next ();
238+ };
239+ ```
240+
241+ ### ` MiddlewareNext `
242+
243+ <p >
244+
245+ ** 类型:** <code >(rewritePayload?: <a href = " #rewritepayload" >RewritePayload</a >) => Promise\< Response\> </code ><br />
246+ </p >
247+
248+ 表示传递给中间件处理程序的 [ ` next() ` 函数] ( #next ) 。
249+
250+ ### ` RewritePayload `
251+
252+ <p >
253+
254+ ** 类型:** ` string | URL | Request ` <br />
255+ <Since v = " 4.13.0" />
256+ </p >
257+
258+ 表示传递给 [ ` next() ` ] ( #next ) 函数时 [ 重写] ( /zh-cn/guides/routing/#重写 ) 的目标。
259+
260+ ## 中间件导出
261+
262+ 在 ` src/middleware.js ` 中定义项目的中间件时,导出以下用户定义的函数:
263+
264+ ### ` onRequest() `
265+
266+ ** 类型:** [ ` MiddlewareHandler ` ] ( #middlewarehandler )
267+
268+ 一个在 ` src/middleware.js ` 里的必须导出的函数,它将在每次渲染页面或 API 路由时被调用。它接受两个参数:[ ` context ` ] ( #context ) 和 [ ` next() ` ] ( #next ) 。` onRequest() ` 必须返回一个 ` Response ` :要么直接返回,要么通过调用 ` next() ` 返回。
269+
270+ ``` js title="src/middleware.js"
271+ export function onRequest (context , next ) {
272+ // 拦截一个请求的响应数据
273+ // 可选修改响应
274+ // 直接返回一个 Response 对象,或者调用 `next()` 的结果
275+ return next ();
276+ };
277+ ```
0 commit comments