首页 > 解决方案 > Validatable 模型的自定义验证错误消息

问题描述

是否可以为内置Validatable协议提供自定义验证错误消息?
我有这个验证:

static func validations() throws -> Validations<NewsletterListItem> {
    var validations = Validations(NewsletterListItem.self)
    validations.add(\.email, at: ["email"], .email)
    return validations
}

它产生以下消息:

{
  "error": true,
  "reason": "duplicate key value violates unique constraint \"uq:newsletter_list.email\""
}

...我想改进。

标签: swiftvalidationvapor

解决方案


事实证明,Validatable这只添加了约束,但并没有验证它们本身。因此,您需要捕获错误,检查它是什么错误,然后返回/抛出所需的响应消息,而不是提供Validatable错误消息。这样做的一个好地方是.save()调用模型:

以下示例位于以下路由处理程序中POST /subscribe-to-newsletter

return try item.save(on: req).catchMap { error in
    if error.localizedDescription.contains("uq:newsletter_list.email") {
        throw Abort(.ok, reason: "You're already subscribed to newsletter")
    }
    throw Abort(.badRequest, reason: "error: \(error.localizedDescription)")
}

推荐阅读