这是与Vapor ValidationSuite和Validator相关的Swift Vapor问题。
我的班级有一个名字变量。我曾经将name声明为String。但我想在这个领域进行验证。所以我继承了经过验证的Name字段的属性。请参阅以下示例代码。
class Name: ValidationSuite {
static func validate(input value: String) throws {
let evaluation = OnlyAlphanumeric.self
&& Count.min(5)
&& Count.max(20)
try evaluation.validate(input: value)
}
}
以下代码显示了我的课程。有趣的观点;这继承自Model类(因为它连接到数据库)并使用Node作为ID。您可以看到我声明了name变量以符合Name类型。
final class LedgerUser: Model {
var id: Node?
var name: Name
这会产生一些"表达式类型不明确,没有更多的上下文"。我想这与Node从mySQL数据库中检索字符串并且不知道如何将其转换为Name类型有关?
答案 0 :(得分:2)
使用验证器的语法类似于Valid<Name>
。
在此处查看有关常见用法的文档:https://vapor.github.io/documentation/guide/validation.html#common-usage
以下代码应该有效:
final class LedgerUser: Model {
var id: Node?
var name: Valid<Name>
答案 1 :(得分:1)
谢谢@Tanner。
对于那些遇到同样问题的人 - 只需在实例化类时传入整个请求对象。在以下示例中,查看 shoprequest 。这就是我错了。 Vapor为您提供繁重的工作。例如:
drop.post("shop") { shoprequest in
guard let name = shoprequest.data["name"].string else {
throw Abort.custom(status: .badRequest, message: "Please enter a shop")
}
do {
var coffeeshop = try CoffeeShop(request: shoprequest)
}
catch let error as ValidationErrorProtocol {
print(error.message)
throw Abort.custom(status: .badRequest, message: "Please check your coffee shop name")
}
return "You were a good coffee shop name."
}
因此,当您尝试实例化CoffeeShop对象时,它会根据您的规则对其进行验证。
class CoffeeShop {
var name: Valid<Name>
init(request: Request) throws {
name = try request.data["name"].validated()
}
}