一个中间件,用于捕获来自路由处理程序和其他中间件的错误,并将它们转换为 JSON 响应。
将包声明添加到您的项目的 manifest dependencies
数组中
.package(url: "https://github.com/skelpo/APIErrorMiddleware.git", from: "0.1.0")
然后将 APIErrorMiddleware
库添加到您想访问该模块的任何目标的 dependencies
数组中。
如果您只想在某些路由上使用 APIErrorMiddleware
,您可以创建一个新的路由组,并使用它注册您的路由
let api = router.group(APIErrorMiddleware())
api.get(...)
但是,如果您正在创建一个 API 服务,并希望所有错误都被该中间件捕获,您可能想将其添加到您的 MiddlewareConfig
中。在 configure.swift
中,导入 APIErrorMiddleware 模块。 configure(_:_:_:)
函数的主体中可能有一个 MiddlewareConfig
实例。如果没有,创建一个并将其注册到 services 中。
您可以使用以下方式将中间件注册到 MiddlewareConfig
中
middlewares.use(APIErrorMiddleware.self)
最有可能的是,您希望首先注册此中间件。 这确保了所有错误都被捕获,并且在它的响应器运行后我们不会抛出任何错误。 不过,您可能希望在此之后运行一些,例如 Vapor 内置的 DateMiddleware
。
此中间件支持自定义特殊化,可以将 Swift Error
转换为消息和状态码,以用于中间件返回的响应。
要将特殊化添加到中间件,请使用要使用的特殊化初始化它
middlewares.use(APIErrorMiddleware(specializations: [
ModelNotFound()
]))
该包提供的特殊化如下:
ModelNotFound
:捕获 Fluent 在从参数获取模型时抛出的 modelNotFound
错误,并将其转换为 404 错误。要创建您自己的特殊化,只需将任何类型符合 ErrorCatchingSpecialization
协议,并实现 convert(error:on:)
方法即可。