簡體   English   中英

在 Swift Vapor 框架中鏈接兩個期貨

[英]Chaining two futures in Swift Vapor framework

我有這個功能來檢查注冊期間數據庫中是否已經存在用戶名(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、tried.add() 和其他奇怪的東西,但我無法讓它工作。 我還需要保留這種語法而不是使用 async/await 語法。

修改您的查詢以包含一個group

query.group(.or) { group in
    group.filter(\User.$username == username).filter(\User.$email == email)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM