我有一个函数,在注册过程中检查用户名是否已经存在于数据库中(REST API)。如果用户名已经存在,则会显示一个漂亮的错误消息。现在我想为电子邮件添加相同的检查,带有一个漂亮的错误消息,并检查用户名和电子邮件是否都已经存在,同样带有它自己的漂亮的错误消息。
我没有太多的异步编码经验,我不明白如何链两个未来。
主要功能如下:
fileprivate func create(req: Request) throws -> EventLoopFuture<NewSession> {
try UserSignup.validate(content: req)
let userSignup = try req.content.decode(UserSignup.self)
let user = try User.create(from: userSignup)
var token: Token!
return checkIfUserExists(userSignup.username, req: req).flatMap { exists in
guard !exists else {
return req.eventLoop.future(error: UserError.usernameTaken)
}
return user.save(on: req.db)
}.flatMap {
guard let newToken = try? user.createToken(source: .signup) else {
return req.eventLoop.future(error: Abort(.internalServerError))
}
token = newToken
return token.save(on: req.db)
}.flatMapThrowing {
NewSession(token: token.value, user: try user.asPublic())
}
}
这是checkIfUserExists函数:
private func checkIfUserExists(_ username: String, req: Request) -> EventLoopFuture<Bool> {
User.query(on: req.db)
.filter(\.$username == username)
.first()
.map { $0 != nil }
}
这是checkIfEmailExists函数:
private func checkIfEmailExists(_ email: String, req: Request) -> EventLoopFuture<Bool> {
User.query(on: req.db)
.filter(\.$email == email)
.first()
.map { $0 != nil }
}
我试过if-else,试过.add()和其他奇怪的东西,但我不能让它工作。而且我需要保持这种语法,而不是使用async/await语法。
1条答案
按热度按时间6l7fqoea1#
修改查询以包含
group
: