Leaf Error Middleware

Language Build Status Code Coverage MIT License

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)

该闭包接收三个参数

自定义映射

默认情况下,您需要在应用程序中包含两个 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.leaf403.leaf 模板。 捕获到的任何其他错误都将返回 serverError.leaf 模板。 通过提供映射,您将覆盖默认的 404 模板,如果您想使用它,则需要重新指定它。

默认上下文

如果使用默认上下文,serverError.leaf 模板将在其上下文中传递最多三个参数

如果已知 reason 参数,则 404.leaf 模板和任何其他自定义错误模板将在上下文中获取一个 reason 参数。