Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i18n(zh-cn): Update docs for 4.13 #8992

Merged
merged 16 commits into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions src/content/docs/zh-cn/guides/middleware.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ i18nReady: true
---
import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro';
import { Steps } from '@astrojs/starlight/components';
import Since from '~/components/Since.astro';

**中间件**允许你拦截请求和响应,并在即将渲染页面或端点时动态注入行为。对于所有预渲染的页面,这种渲染发生在构建时,但对于按需渲染的页面,这种渲染发生在请求路由时,这时可以使用 [额外的 SSR 功能如 cookie 和标头](/zh-cn/guides/server-side-rendering/#按需渲染功能特性)。

Expand Down Expand Up @@ -195,6 +196,80 @@ export const onRequest = sequence(validation, auth, greeting);
授权响应
验证响应
```

## 重写

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

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

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

```js title="src/middleware.js"
import { isLoggedIn } from "~/auth.js"
export function onRequest (context, next) {
if (!isLoggedIn(context)) {
// 如果用户未登录,则更新请求来渲染 `/login` 路由,
// 并添加标头以指示在成功登录应该把用户重定向到何处。
// 重新执行中间件
liruifengv marked this conversation as resolved.
Show resolved Hide resolved
return context.rewrite(new Request("/login", {
headers: {
"x-redirect-to": context.url.pathname
}
}));
}

return next();
};
```

你也可以向 `next()` 函数传递一个可选的 URL 路径参数,以重写当前的 `Request` 而不重新触发新的渲染阶段。重写路径的位置可以作为字符串、URL 或 `Request` 提供:

```js title="src/middleware.js"
import { isLoggedIn } from "~/auth.js"
export function onRequest (context, next) {
if (!isLoggedIn(context)) {
// 如果用户未登录,则更新请求来渲染 `/login` 路由,
// 并添加标头以指示在成功登录应该把用户重定向到何处。
// 将新的 `context` 返回给任何后续中间件。
return next(new Request("/login", {
headers: {
"x-redirect-to": context.url.pathname
}
}));
}

return next();
};
```

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

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

```js title="src/middleware.js"
// 当前 URL 是 https://example.com/blog

// 第一个中间件函数
async function first(_, next) {
console.log(context.url.pathname) // 这里会打印 "/blog"
// 重写到一个新的路由,首页
// 返回更新的 `context`,传递给下一个函数
return next("/")
}

// 当前 URL 仍然是 https://example.com/blog

// 第二个中间件函数
async function second(context, next) {
// 接收更新后的 `context`
console.log(context.url.pathname) // 这里会打印 "/"
return next()
}

export const onRequest = sequence(first, second);
```

## 错误页面

即使找不到匹配的路由,中间件也会尝试为所有按需渲染的页面运行。这包括 Astro 的默认(空白)404 页面和任何自定义 404 页面。然而,是否运行该代码取决于[适配器](/zh-cn/guides/server-side-rendering/)。一些适配器可能会提供特定平台的错误页面。
Expand Down
63 changes: 63 additions & 0 deletions src/content/docs/zh-cn/guides/routing.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,69 @@ if (!isLoggedIn(cookie)) {
</html>
```

## 重写

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

重写允许你提供不同的路由,而无需将浏览器重定向到不同的页面。浏览器将在 URL 栏中显示原始地址,但实际上会显示 [`Astro.rewrite()`](/zh-cn/reference/api-reference/#astrorewrite) 提供的 URL 的内容。

:::tip
对于永久性移动的内容,或者将用户重定向到具有新 URL 的不同页面(例如登录后的用户仪表盘),请使用 [重定向](#重定向)。
:::

重写对于在不同路径(例如 `/products/shoes/men/` 和 `/products/men/shoes/`)显示相同内容非常有用,而无需维护两个不同的源文件。

重写对于用户体验和 SEO 也非常有用。它允许你显示需要将访问者重定向到其他页面或返回 404 状态的内容。
重写的一个常见用途是为语言的不同变体显示相同的本地化内容。

以下示例使用重写来在访问 `/es-CU/`(古巴西班牙语)URL 路径时渲染 `/es/` 版本的页面。当访问者导航到 `/es-cu/articles/introduction` URL 时,Astro 将渲染由文件 `src/pages/es/articles/introduction.astro` 生成的内容。

```astro title="src/pages/es-cu/articles/introduction.astro"
---
return Astro.rewrite("/es/articles/introduction")
---
```

使用 `context.rewrite()` 在你的端点文件中重定向到不同的页面:

```js title="src/pages/api.js"
export function GET(context) {
if (!context.locals.allowed) {
return context.rewrite("/")
}
}
```

如果传递给 `Astro.rewrite()` 的 URL 引发运行时错误,Astro 将在开发中显示错误覆盖层,并在生产中返回 500 状态码。如果你的项目中不存在该 URL,则将返回 404 状态码。

你可以有意创建一个重写来渲染你的 `/404` 页面,例如,以指示你的电子商店中的产品不再可用:

```astro title="src/pages/[item].astro"
---
const { item } = Astro.params;
if (!itemExists(item)) {
return Astro.rewrite("/404")
}
---
<div>...</div>
```

你也可以根据 HTTP 响应状态有条件地重写,例如在访问不存在的 URL 时显示站点上的某个页面:

```js title="src/middleware.mjs"
export const onRequest = async (context, next) => {
const response = await next();
if (response.status === 404) {
return context.rewrite("/");
}
return response;
}
```

显示指定重写路径的内容之前,`Astro.rewrite()` 函数将触发一个新的完整渲染阶段。这将为新的路由/请求重新执行任何中间件。

<ReadMore>有关更多信息,请查阅 [`Astro.rewrite()` API 参考](/zh-cn/reference/api-reference/#astrorewrite)</ReadMore>

## 路由优先级顺序

可能有多个已定义的路由试图构建相同的 URL 路径。例如,下面所有这些路由都有可能构建 `/posts/create`:
Expand Down
90 changes: 90 additions & 0 deletions src/content/docs/zh-cn/reference/api-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,44 @@ if (!isLoggedIn(cookie)) {

当前页面的[标准链接][canonical]。

### `Astro.rewrite()`

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

**类型:** `(rewritePayload: string | URL | Request) => Promise<Response>`

允许你从不同的 URL 或路径提供内容,而不会将浏览器重定向到新页面。

该方法接受字符串、`URL` 或 `Request` 作为路径的位置。

使用字符串提供一个明确的路径:

```astro title="src/pages/index.astro"
---
return Astro.rewrite("/login")
---
```

当你需要构造重写的 URL 路径时,使用 `URL` 类型。以下示例通过从相对路径 `"../"` 创建一个新的 URL 来呈现页面的父路径:

```astro title="src/pages/blog/index.astro"
---
return Astro.rewrite(new URL("../", Astro.url))
---
```

使用 `Request` 类型完全控制发送到新路径的 `Request`。以下示例发送一个请求来渲染父页面,同时提供标头:

```astro title="src/pages/blog/index.astro"
---
return Astro.rewrite(new Request(new URL("../", Astro.url), {
headers: {
"x-custom-header": JSON.stringify(Astro.locals.someValue)
}
}))
---
```

### `Astro.url`

<p><Since v="1.0.0-rc" /></p>
Expand Down Expand Up @@ -769,6 +807,52 @@ export function GET({ redirect }: APIContext) {

另见:[`Astro.redirect()`](#astroredirect)

### `context.rewrite()`

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

**类型:** `(rewritePayload: string | URL | Request) => Promise<Response>`

允许你从不同的 URL 或路径提供内容,而不会将浏览器重定向到新页面。

该方法接受字符串、`URL` 或 `Request` 作为路径的位置。

使用字符串提供一个明确的路径:

```ts
import type { APIContext } from 'astro';

export function GET({ rewrite }: APIContext) {
return rewrite('/login');
}
```

当你需要构造重写的 URL 路径时,使用 `URL` 类型。以下示例通过从相对路径 `"../"` 创建一个新的 URL 来呈现页面的父路径:

```ts
import type { APIContext } from 'astro';

export function GET({ rewrite }: APIContext) {
return rewrite(new URL("../", Astro.url));
}
```

使用 `Request` 类型完全控制发送到新路径的 `Request`。以下示例发送一个请求来渲染父页面,同时提供标头:

```ts
import type { APIContext } from 'astro';

export function GET({ rewrite }: APIContext) {
return rewrite(new Request(new URL("../", Astro.url), {
headers: {
"x-custom-header": JSON.stringify(Astro.locals.someValue)
}
}));
}
```

另见:[`Astro.rewrite()`](#astrorewrite)

### `context.locals`

`context.locals` 是一个对象,用于在请求的生命周期内存储和访问任意信息。
Expand Down Expand Up @@ -1400,6 +1484,12 @@ const blog = defineCollection({

这是 `onRequest()` 的可选参数,并且可能会提供中间件返回的所需 `Response`。

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

**类型:** `(rewritePayload?: string | URL | Request) => Promise<Response>`

它接受一个可选的 URL 路径参数,可以是字符串、`URL` 或 `Request`,用于[重写](/zh-cn/guides/routing/#重写)当前请求而不重新触发新的渲染阶段。

### `sequence()`

一个接受中间件函数作为参数的函数,它将按照它们传递的顺序执行它们。
Expand Down
47 changes: 0 additions & 47 deletions src/content/docs/zh-cn/reference/configuration-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -1364,53 +1364,6 @@ export function Comment({ postId }: { postId: string }) {
}
```

### experimental.contentCollectionJsonSchema

<p>

**类型:** `boolean`<br />
**默认值:** `false`<br />
<Since v="4.5.0" />
</p>

此功能将为 `type: 'data'` 的内容集合自动生成一个 JSON 模式,该模式可用作 VSCode 等工具中 TypeScript 风格的自动完成/提示的 `$schema` 值。

要启用此功能,请添加实验性标志:

```diff
import { defineConfig } from 'astro/config';
export default defineConfig({
experimental: {
+ contentCollectionJsonSchema: true
}
});
```

此实验性实现要求你在内容集合的每个数据条目文件中手动引用模式:

```diff
// src/content/test/entry.json
{
+ "$schema": "../../../.astro/collections/test.schema.json",
"test": "test"
}
```

或者,你也可以在你的 [VSCode `json.schemas` 设置](https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings)中进行配置:

```diff
"json.schemas": [
{
"fileMatch": [
"/src/content/test/**"
],
"url": "./.astro/collections/test.schema.json"
}
]
```

请注意,这个初始实现使用了一个库,该库对于高级 Zod 模式有[已知的问题](https://github.com/StefanTerdell/zod-to-json-schema#known-issues),因此在启用实验性标志之前,你可能希望查阅这些限制。

### experimental.clientPrerender

<p>
Expand Down
2 changes: 2 additions & 0 deletions src/content/docs/zh-cn/reference/error-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,7 @@ githubURL: https://github.com/withastro/astro/blob/main/packages/astro/src/core/
- [**DataCollectionEntryParseError**](/zh-cn/reference/errors/data-collection-entry-parse-error/)<br/>Data collection entry failed to parse.
- [**DuplicateContentEntrySlugError**](/zh-cn/reference/errors/duplicate-content-entry-slug-error/)<br/>Duplicate content entry slug.
- [**ActionsWithoutServerOutputError**](/zh-cn/reference/errors/actions-without-server-output-error/)<br/>Actions must be used with server output.
- [**ActionsUsedWithForGetError**](/zh-cn/reference/errors/actions-used-with-for-get-error/)<br/>An invalid Action query string was passed by a form.
- [**ActionQueryStringInvalidError**](/zh-cn/reference/errors/action-query-string-invalid-error/)<br/>An invalid Action query string was passed by a form.
- [**UnsupportedConfigTransformError**](/zh-cn/reference/errors/unsupported-config-transform-error/)<br/>Unsupported transform in content config.
- [**RouteNotFound**](/zh-cn/reference/errors/route-not-found/)<br/>Route not found.
liruifengv marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: An invalid Action query string was passed by a form.
i18nReady: true
githubURL: https://github.com/withastro/astro/blob/main/packages/astro/src/core/errors/errors-data.ts
---

> **ActionQueryStringInvalidError**: 服务器收到查询字符串 `?_astroAction=ACTION_NAME`,但找不到具有该名称的 action。如果你在开发过程中更改了 action 的名称,请从 URL 中删除此查询参数并刷新。

## 哪里出了问题?

服务器收到查询字符串 `?_astroAction=name`,但找不到具有该名称的 action。使用 action 函数的 `.queryString` 属性来检索表单 `action` URL。

**请参阅:**
- [Actions RFC](https://github.com/withastro/roadmap/blob/actions/proposals/0046-actions.md)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
title: An invalid Action query string was passed by a form.
i18nReady: true
githubURL: https://github.com/withastro/astro/blob/main/packages/astro/src/core/errors/errors-data.ts
---

> **ActionsUsedWithForGetError**: 使用 GET 请求从表单调用 Action ACTION_NAME,但只支持 POST 请求。这通常是因为表单上缺少 `method="POST"`。

## 哪里出了问题?

Action 被使用 GET 请求从表单调用,但只支持 POST 请求。这通常是因为表单上缺少 `method="POST"`。
liruifengv marked this conversation as resolved.
Show resolved Hide resolved

**请参阅:**
- [Actions RFC](https://github.com/withastro/roadmap/blob/actions/proposals/0046-actions.md)
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ i18nReady: true
githubURL: https://github.com/withastro/astro/blob/main/packages/astro/src/core/errors/errors-data.ts
---

:::caution[废弃]
liruifengv marked this conversation as resolved.
Show resolved Hide resolved
Astro 不再会抛出此错误。
:::

> **RewriteEncounteredAnError**: 你尝试渲染的路由 ROUTE 不存在,或者在渲染阶段发生了错误。STACK ? STACK : ''。

## 发生了什么错误?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ Astro.rewrite("/target")

**请参阅:**
- [Request.clone()](https://developer.mozilla.org/zh-CN/docs/Web/API/Request/clone)
- [Astro.rewrite](/zh-cn/reference/configuration-reference/#experimentalrewriting)
- [Astro.rewrite](/zh-cn/reference/api-reference/#astrorewrite)
Loading