繁体   English   中英

使用 Vapor 进行查询和映射

[英]Querying and mapping using Vapor

我正在尝试使用 Swift 和 Vapor 编写一个函数,但我不明白为什么一个语句会在另一个语句之前打印:

// Logout user
func logout(_ req: Request) throws -> Future<APIResponseMessage> {
    let userID = self.checkAccessToken(req: req)

    // Delete access token here

    let apiResponseMessage = APIResponseMessage()
    apiResponseMessage.message = "success"
    apiResponseMessage.userID = userID
    return apiResponseMessage.create(on: req)
}

func checkAccessToken(req: Request) -> Int {
    let bearerAuthorization = req.http.headers.bearerAuthorization
    guard let _bearerAuthorization = bearerAuthorization else {
        // Works fine
        print("no bearer incluced")
        return 0
    }

    let _ = AccessToken.query(on: req).filter(\.accessToken == _bearerAuthorization.token).first().map(to: Int.self) { queriedAccessToken in
        // This should be first
        print("This gets printed second")
        return queriedAccessToken!.userID!
    }

    // This should be second
    print("This gets printed first")
    return 0
}

谁能告诉我如何让第二个打印语句等到第一个完成?

现在它导致我的注销功能以userID == 0运行,而这不应该是这种情况

正如@nathan 所说,这是由于您的代码是异步的。 您的.map回调就像在向 iOS 应用程序的外部 API 发出请求时传递给URLSession.dataTask的闭包。

Vapor 使用与您在 iOS 中使用的异步模型略有不同的异步模型,使用承诺和期货而不是回调闭包。 您可以在文档中阅读有关它们的信息

在您的情况下,您希望返回从AccessToken查询中获得的userID 为此,您首先需要将方法的返回类型从Int更改为Future<Int> 然后,您可以从方法中返回它,而不是将.map调用的结果分配给_

func checkAccessToken(req: Request) -> Future<Int> {
    let bearerAuthorization = req.http.headers.bearerAuthorization
    guard let _bearerAuthorization = bearerAuthorization else {
        return req.future(0)
    }

    return AccessToken.query(on: req).filter(\.accessToken == _bearerAuthorization.token).first().map(to: Int.self) { queriedAccessToken in
        return queriedAccessToken!.userID!
    }
}

我建议您查看对queriedAccessTokenuserID值的错误处理,这样您就不会强制解包它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM