update cn basics translation part2 (#733)

This commit is contained in:
JIN 2022-09-20 10:36:08 +08:00 committed by GitHub
parent 7e8223c1f8
commit 961d96b6c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 41 deletions

View File

@ -1,9 +1,8 @@
# 环境
Vapor 的环境API帮助您动态配置您的应用程序。默认情况下,你的应用程序将使用 `development` 环境。你可以定义其他有用的环境,如 `production``staging`,并在每种情况下改变你的应用是如何配置的。您还可以从进程的环境或 `.Env` (dotenv)文件读取配置取决于您的需要。
Vapor 的环境 API 帮助你动态配置你的应用程序。默认情况下,你的应用程序将使用 `development` 环境。你可以定义其他有用的环境,如 `production``staging`,并在每种情况下改变你的应用是如何配置的。你还可以从进程的环境或 `.Env` (dotenv) 文件读取配置取决于你的需要。
要访问当前环境,请使用 `app.environment`。你可以在 `configure(_:)` 中通过这个属性来执行不同的配置逻辑。
To access the current environment, use `app.environment`. You can switch on this property in `configure(_:)` to execute different configuration logic.
```swift
switch app.environment {
@ -16,7 +15,7 @@ default:
## 改变环境
默认情况下,你的应用程序将在 `development` 环境中运行。你可以通过在应用程序引导期间传递`--env` (`-e`)标志来改变这一点。
默认情况下,你的应用程序将在 `development` 环境中运行。你可以通过在应用程序引导期间传递 `--env` (`-e`) 标志来改变这一点。
```swift
vapor run serve --env production
@ -24,16 +23,16 @@ vapor run serve --env production
Vapor 包含下列环境:
|name|short|description|
|名称|缩写|描述|
|-|-|-|
|production|prod|Deployed to your users.|
|development|dev|Local development.|
|testing|test|For unit testing.|
|production|prod|部署到线上环境。|
|development|dev|本地开发环境。|
|testing|test|为了单元测试。|
!!! info "信息"
`production` 环境默认为 `notice` 级别的日志记录,除非另有说明。所有其他环境默认为 `info`
`production` 环境默认为 `notice` 级别的日志记录,除非另有说明。所有其他环境默认为 `info`
您可以将全名或短名传递给`--env` (`-e`)标志。
你可以将全名或短名传递给`--env` (`-e`) 标志。
```swift
vapor run serve -e prod
@ -41,14 +40,14 @@ vapor run serve -e prod
## 进程变量
`Environment` 提供了一个简单的、基于字符串的API来访问进程的环境变量。
`Environment` 提供了一个简单的、基于字符串的 API 来访问进程的环境变量。
```swift
let foo = Environment.get("FOO")
print(foo) // String?
```
除了 `get` 之外,`Environment` 还通过 `process` 提供了一个动态成员查找API。
除了 `get` 之外,`Environment` 还通过 `process` 提供了一个动态成员查找 API。
```swift
let foo = Environment.process.FOO
@ -62,22 +61,21 @@ export FOO=BAR
vapor run serve
```
当在Xcode中运行应用程序时你可以通过编辑 `Run` scheme来设置环境变量。
当在 Xcode 中运行应用程序时,你可以通过编辑 `Run` scheme 来设置环境变量。
## .env (dotenv)
Dotenv文件包含一个键值对列表这些键值对将自动加载到环境中。这些文件使配置环境变量变得很容易而不需要手动设置它们。
Dotenv 文件包含一个键值对列表,这些键值对将自动加载到环境中。这些文件使配置环境变量变得很容易,而不需要手动设置它们。
Vapor 将在当前工作目录中查找dotenv文件。如果你使用Xcode确保通过编辑 `Run` scheme 设置工作目录。
Vapor 将在当前工作目录中查找 `.env` 文件。如果你使用 Xcode确保通过编辑 `Run` scheme 设置工作目录。
Assume the following `.env` file placed in your projects root folder:
假设以下 `.env` 文件放在你的项目根文件夹中:
```sh
FOO=BAR
```
您的应用程序启动时,您将能够像访问其他进程环境变量一样访问该文件的内容。
你的应用程序启动时,你将能够像访问其他进程环境变量一样访问该文件的内容。
```swift
let foo = Environment.get("FOO")
@ -87,7 +85,7 @@ print(foo) // String?
!!! info "信息"
`.env` 文件中指定的变量不会覆盖进程环境中已经存在的变量。
在`.env`旁边Vapor 还将尝试为当前环境加载一个dotenv文件。例如`development` 环境中,蒸汽将加载 `.env.development`。特定环境文件中的任何值都将优先于 `.env` 文件内的值。
除了 `.env`Vapor 还将尝试为当前环境加载一个 `.env.environment` 文件。例如,在 `development` 环境中Vapor 将加载 `.env.development`。特定环境文件中的任何值都将优先于 `.env` 文件内的值。
一个典型的模式是项目包含一个 `.env` 文件作为带有默认值的模板。在 `.gitignore` 中使用以下模式忽略特定的环境文件
@ -95,7 +93,7 @@ print(foo) // String?
.env.*
```
当项目被 cloned 到新计算机时,已经带有正确的值的`.env`模板可以被复制。
当项目被 cloned 到新计算机时,已经带有正确的值的 `.env` 模板可以被复制。
```sh
cp .env .env.development
@ -103,9 +101,9 @@ vim .env.development
```
!!! warning "警告"
带有敏感信息(如密码)的Dotenv文件不应提交给版本控制。
不应提交包含密码等敏感信息的 `.env` 文件到版本控制。
如果你在加载dotenv文件时遇到了困难,尝试使用 `--log debug` 来启用调试日志以获取更多信息。
如果你在加载 `.env` 文件时遇到了困难,尝试使用 `--log debug` 来启用调试日志以获取更多信息。
## 自定义环境
@ -131,10 +129,10 @@ let app = Application(env)
defer { app.shutdown() }
```
`detect` 方法使用进程的命令行参数并自动解析 `--env`标志。您可以通过初始化自定义的 `Environment` 结构来覆盖此行为。
`detect` 方法使用进程的命令行参数并自动解析 `--env` 标志。你可以通过初始化自定义的 `Environment` 结构来覆盖此行为。
```swift
let env = Environment(name: "testing", arguments: ["vapor"])
```
参数数组必须包含至少一个表示可执行名称的参数。可以提供进一步的参数来模拟通过命令行传递参数。这对于测试特别有用。
参数数组必须包含至少一个表示可执行名称的参数。可以提供更多参数来模拟通过命令行传递参数。这对于测试特别有用。

View File

@ -83,11 +83,11 @@ export LOG_LEVEL=debug
vapor run serve
```
这两种方法可以在 Xcode 中编辑 `Run` (scheme)模式进行修改。
这两种方法可以在 Xcode 中编辑 `Run`scheme模式进行修改。
## 配置
`SwiftLog` 可以通过每次进程启动 `LoggingSystem` 时进行配置。Vapor 项目通常在 `main.swift` 执行操作。
SwiftLog 可以通过每次进程启动 `LoggingSystem` 时进行配置。Vapor 项目通常在 `main.swift` 执行操作。
```swift
import Vapor

View File

@ -1,6 +1,6 @@
# Validation API
Vapor 的 **Validation API** 可帮助你在使用 [Content](content.md) API 解码数据之前,对传入的请求进行验证。
Vapor 的 **Validation API** 可帮助你在使用 [Content](content.zh.md) API 解码数据之前,对传入的请求进行验证。
## 介绍
@ -9,7 +9,7 @@ Vapor 对 Swift 的类型安全的`可编码`协议进行了深度集成,这
### 语义可读错误
如果取得的数据无效,使用 [Content](content.md) API 对其解码将产生错误。但是,这些错误消息有时可能缺乏可读性。例如,采用以下字符串支持的枚举:
如果取得的数据无效,使用 [Content](content.zh.md) API 对其解码将产生错误。但是,这些错误消息有时可能缺乏可读性。例如,采用以下字符串支持的枚举:
```swift
enum Color: String, Codable {
@ -17,7 +17,7 @@ enum Color: String, Codable {
}
```
如果用户尝试将字符串“purple”传递给“Color”类型的属性,则将收到类似于以下内容的错误:
如果用户尝试将字符串 `”purple”` 传递给 `“Color”` 类型的属性,则将收到类似于以下内容的错误:
```
Cannot initialize Color from invalid String value purple for key favoriteColor
@ -64,7 +64,7 @@ app.post("users") { req -> CreateUser in
### 添加验证
第一步是在你要解码的类型(在本例中为 CreateUser继承 **Validatable** 协议并实现 `validations` 静态方法,可在 `extension` 中完成。
第一步是在你要解码的类型(在本例中为 `CreateUser`)遵循 `Validatable` 协议并实现 `validations` 静态方法,可在 `extension` 中完成。
```swift
extension CreateUser: Validatable {
@ -74,18 +74,18 @@ extension CreateUser: Validatable {
}
```
验证`CreateUser`后,将调用静态方法 `validations_ :)`。你要执行的所有验证都应添加到 **Validations** 集合中。让我们添加一个简单的验证,以验证用户的电子邮件是否有效。
验证 `CreateUser` 后,将调用静态方法 `validations_ :)`。你要执行的所有验证都应添加到 **Validations** 集合中。让我们添加一个简单的验证,以验证用户的电子邮件是否有效。
```swift
validations.add("email", as: String.self, is: .email)
```
第一个参数是参数值的预期键,在本例中为`email`。这应与正在验证的类型上的属性名称匹配。第二个参数`as`是预期的类型,在这种情况下为`String`。该类型通常与属性的类型匹配。最后,可以在第三个参数`is`之后添加一个或多个验证器。在这种情况下,我们添加一个验证器,以检查该值是否为电子邮件地址。
第一个参数是参数值的预期键,在本例中为 `email`。这应与正在验证的类型上的属性名称匹配。第二个参数 `as` 是预期的类型,在这种情况下为 `String`。该类型通常与属性的类型匹配。最后,可以在第三个参数 `is` 之后添加一个或多个验证器。在这种情况下,我们添加一个验证器,以检查该值是否为电子邮件地址。
### 验证请求的 `Content`
当你的数据类型继承了 **Validatable**,就可以使用 `validate(content:)` 静态方法来验证请求的 `content`。在路由处理程序中 `req.content.decode(CreateUser.self)` 之前添加以下行:
当你的数据类型继承了 `Validatable`,就可以使用 `validate(content:)` 静态方法来验证请求的 `content`。在路由处理程序中 `req.content.decode(CreateUser.self)` 之前添加以下行:
```swift
try CreateUser.validate(content: req)
@ -115,14 +115,14 @@ email is not a valid email address
### 验证请求的 `Query`
当你的数据类型继承了 **Validatable**,就可以使用 `validate(query:)` 静态方法来验证请求的 `query`。在路由处理程序中添加以下行:
当你的数据类型继承了 `Validatable`,就可以使用 `validate(query:)` 静态方法来验证请求的 `query`。在路由处理程序中添加以下行:
```swift
try CreateUser.validate(query: req)
req.query.decode(CreateUser.self)
```
现在,尝试发送一下包含错误的 email 在 query 的请求
现在,尝试发送以下请求,该请求在查询字符串中包含无效的电子邮件
```http
GET /users?age=4&email=foo&favoriteColor=green&name=Foo&username=foo HTTP/1.1
@ -150,7 +150,7 @@ age is less than minimum of 13, email is not a valid email address
### 字符串验证
接下来,让我们添加对“名称”和“用户名”的验证。
接下来,让我们添加对 `name``username` 的验证。
```swift
validations.add("name", as: String.self, is: !.empty)
@ -159,26 +159,51 @@ validations.add("username", as: String.self, is: .count(3...) && .alphanumeric)
名称验证使用 `!` 运算符将 `.empty` 验证反转。这要求该字符串不为空。
用户名验证使用`&&`组合了两个验证器。这将要求该字符串的长度至少为3个字符并且使用 && 来包含字母数字字符。
用户名验证使用`&&`组合了两个验证器。这将要求该字符串的长度至少为3个字符并且仅包含字母数字字符。
### 枚举验证
最后,让我们看一下更高级的验证,以检查提供的`favoriteColor`是否有效:
最后,让我们看一下更高级的验证,以检查提供的 `favoriteColor` 是否有效:
```swift
validations.add("favoriteColor", as: String.self,is: .in("red", "blue","green"),required: false)
validations.add(
"favoriteColor", as: String.self,
is: .in("red", "blue","green"),
required: false
)
```
由于无法从无效值中解码“颜色”,因此此验证将“字符串”用作基本类型。它使用 .in 验证器来验证该值是有效的选项:红色、蓝色或绿色。由于该值是可选的,因此将`required`设置为 false 表示如果请求数据中缺少此字段,则验证不会失败。
由于无法从无效值中解码 `Color`,因此此验证将 `String` 用作基本类型。它使用 `.in` 验证器来验证该值是有效的选项:红色、蓝色或绿色。由于该值是可选的,因此将 `required` 设置为 false 表示如果请求数据中缺少此字段,则验证不会失败。
请注意,如果缺少此字段,则收藏夹颜色验证将通过,但如果提供 `null`,则不会通过。 如果要支持`null`,请将验证类型更改为`String?`,并使用 `.nil ||`
请注意,如果缺少此字段,则收藏夹颜色验证将通过,但如果提供 `null`,则不会通过。 如果要支持 `null`,请将验证类型更改为 `String?`,并使用 `.nil ||`
```swift
validations.add("favoriteColor", as: String?.self,is: .nil || .in("red", "blue", "green"),required: false)
validations.add(
"favoriteColor", as: String?.self,
is: .nil || .in("red", "blue", "green"),
required: false
)
```
### 自定义错误
你可能希望将自定义的可读错误添加到你的 `Validations` 或者 `Validator`。为此,只需添加 `customFailureDescription` 参数,该参数将覆盖默认错误信息。
```swift
validations.add(
"name",
as: String.self,
is: !.empty,
customFailureDescription: "Provided name is empty!"
)
validations.add(
"username",
as: String.self,
is: .count(3...) && .alphanumeric,
customFailureDescription: "Provided username is invalid!"
)
```
## 验证器