Skip to content

Commit 72209df

Browse files
i18n(zh-cn): Update middleware.mdx & astro-middleware.mdx (#13068)
Co-authored-by: Yan <61414485+yanthomasdev@users.noreply.github.com>
1 parent 2fbfa8b commit 72209df

File tree

2 files changed

+192
-39
lines changed

2 files changed

+192
-39
lines changed

src/content/docs/zh-cn/guides/middleware.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export const onRequest = async (context, next) => {
114114

115115
## 中间件类型
116116

117-
你可以导入并使用 `defineMiddleware()` 实用函数来提供类型安全
117+
你可以导入并使用 [`defineMiddleware()`](/zh-cn/reference/modules/astro-middleware/#definemiddleware) 工具函数来提供类型安全
118118

119119
```ts
120120
// src/middleware.ts
@@ -205,7 +205,7 @@ export const onRequest = sequence(validation, auth, greeting);
205205

206206
<p><Since v="4.13.0" /></p>
207207

208-
`APIContext` 中暴露了一个名为 `rewrite()` 的方法,它的工作方式与 [Astro.rewrite](/zh-cn/guides/routing/#重写) 相同。
208+
`APIContext` 中暴露了一个名为 [`rewrite()`](/zh-cn/reference/api-reference/#rewrite) 的方法,它的工作方式与 [Astro.rewrite](/zh-cn/guides/routing/#重写) 相同。
209209

210210
使用 `context.rewrite()` 在中间件中显示不同页面的内容,而不会将访问者 [重定向](/zh-cn/guides/routing/#动态重定向) 到新页面。这将触发一个新的渲染阶段,导致任何中间件被重新执行。
211211

@@ -249,7 +249,7 @@ export function onRequest (context, next) {
249249

250250
`next` 函数接受与 [`Astro.rewrite()` 函数](/zh-cn/reference/api-reference/#rewrite) 相同的参数。重写路径的位置可以作为字符串、URL 或 `Request` 提供。
251251

252-
当你有多个通过 [sequence()](#中间件链式调用) 链接的中间件函数时,向 `next()` 提交一个路径将在原地重写 `Request`,并且中间件不会再次执行。链中的下一个中间件函数将接收具有其更新的 `context` 的新 `Request`
252+
当你有多个通过 [sequence()](#中间件链式调用) 链接的中间件函数时,向 `next()` 提交一个路径将在原地重写 `Request`,并且中间件不会再次执行。链中的下一个中间件函数将接收具有其更新的 `context` 的新 `Request`
253253

254254
使用此签名调用 `next()` 将使用旧的 `ctx.request` 来创建一个新的 `Request` 对象。这意味着无论是在此重写之前还是之后,只要尝试使用 `Request.body`,都会引发运行时错误。[使用 HTML 表单的 Astro Actions](/zh-cn/guides/actions/#从-html-表单操作调用-action) 经常会引发此错误。在这些情况下,我们建议使用 `Astro.rewrite()` 而不是使用中间件来处理 Astro 模板的重写。
255255

src/content/docs/zh-cn/reference/modules/astro-middleware.mdx

Lines changed: 189 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,109 +16,262 @@ import ReadMore from '~/components/ReadMore.astro';
1616

1717
## `astro:middleware` 导入
1818

19+
以下辅助函数从虚拟中间件模块导入:
20+
1921
```js
2022
import {
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"
3438
import { defineMiddleware } from "astro:middleware";
3539

36-
// `context` 和 `next` 会自动被类型化
3740
export 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"
5255
import { 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

5861
export 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

Comments
 (0)