Leaf Error Middleware 是一个用于 Vapor 的中间件,允许您返回自定义的 404 和服务器错误页面。
请注意,此中间件设计为仅用于 Leaf 前端网站 - 例如,它不应用于为 API 提供 JSON 错误响应。
首先,在您的 Package.swift
文件中将 LeafErrorMiddleware 添加为依赖项
dependencies: [
// ...,
.package(url: "https://github.com/brokenhandsio/leaf-error-middleware.git", from: "4.0.0")
],
targets: [
.target(
name: "App",
dependencies: [
.product(name: "Vapor", package: "vapor"),
...,
.product(name: "LeafErrorMiddleware", package: "leaf-error-middleware")
]
),
// ...
]
要使用 LeafErrorMiddleware 及其传递给模板的默认上下文,请在 configure.swift
中将中间件服务注册到您的 Application
的中间件中(请确保在顶部 import LeafErrorMiddleware
)
app.middleware.use(LeafErrorMiddlewareDefaultGenerator.build())
确保它出现在所有其他中间件之前,以捕获错误。
Leaf Error Middleware 允许您传递一个闭包给 LeafErrorMiddleware
,以便为错误中间件生成自定义上下文。如果您想知道用户是否在 404 页面上登录,这将非常有用。
按如下方式注册中间件
let leafMiddleware = LeafErrorMiddleware() { status, error, req async throws -> SomeContext in
SomeContext()
}
app.middleware.use(leafMiddleware)
该闭包接收三个参数
HTTPStatus
- 返回的响应的状态代码。Error
- 要处理的捕获的错误。Request
- 当前正在处理的请求。 这可以用于记录信息、进行外部 API 调用或检查会话。默认情况下,您需要在应用程序中包含两个 Leaf 模板
404.leaf
serverError.leaf
但是,您可以选择提供一个字典,将任意错误响应(即 >= 400)映射到自定义模板名称,如下所示
let mappings: [HTTPStatus: String] = [
.notFound: "404",
.unauthorized: "401",
.forbidden: "403"
]
let leafMiddleware = LeafErrorMiddleware(errorMappings: mappings) { status, error, req async throws -> SomeContext in
SomeContext()
}
app.middleware.use(leafMiddleware)
// OR
app.middleware.use(LeafErrorMiddlewareDefaultGenerator.build(errorMappings: mapping))
默认情况下,当 Leaf Error Middleware 捕获到 404 错误时,它将返回 404.leaf
模板。 此特定映射还允许基于错误返回 401.leaf
或 403.leaf
模板。 捕获到的任何其他错误都将返回 serverError.leaf
模板。 通过提供映射,您将覆盖默认的 404 模板,如果您想使用它,则需要重新指定它。
如果使用默认上下文,serverError.leaf
模板将在其上下文中传递最多三个参数
status
- 捕获的错误的状态代码statusMessage
- 状态代码的原因reason
- 错误的原因(如果已知)。 否则,不会传入此参数。如果已知 reason
参数,则 404.leaf
模板和任何其他自定义错误模板将在上下文中获取一个 reason
参数。