【问题标题】:How query works in Vapor?查询如何在 Vapor 中工作?
【发布时间】:2019-11-28 10:18:19
【问题描述】:

如果基于facebook用户ID已经存在如何返回用户,如果Vapor中不存在则创建一个新用户?你可以看到我是如何尝试获取数据的,但是得到了错误。

final class User: Content {
    var id: Int?
    var fbId: String

    init(id: Int? = nil, fbId: String) {
        self.id = id
        self.fbId = fbId
    }
}

router.get("user") { (request) -> Future<User> in
    return Future.map(on: request) { () -> User in
        let fbId = try request.query.get(String.self, at: "fbId")
        return User.query(on: request).filter(\.fbId == fbId).first().map { (user) -> (U) in
            if user == nil {
                user = User(fbId: fbId)
            }
            return user
        }
    }
}

【问题讨论】:

    标签: filter future vapor


    【解决方案1】:

    这里发生了一些事情。首先,您不需要第一个 Future.map - 不确定它在做什么。

    然后你有编译器的问题 - 你必须在每个闭包和函数中返回相同的类型,这很尴尬,因为如果你已经有一个用户你可以返回它,如果你没有你需要创建并保存一个,返回Future&lt;User&gt;,与User不一样。

    所以要回答你的问题,U 应该有User,但你真的想将first().map 更改为first().flatMap 在这种情况下U 变为Future&lt;User&gt;。然后您可以执行以下操作:

    router.get("user") { req -> Future<User> in
        let fbID = try req.query.get(String.self, at: "fbId")
        return User.query(on: req).filter(\.fbId == fbID).first().flatMap { user in
            let returnedUser: Future<User>
            if let foundUser = user {
                returnedUser = req.future(foundUser)
            } else {
                let newUser = User(fbId: fbID)
                returnedUser = newUser.save(on: req)
            }
            return returnedUser
        }
    }
    

    解决您的问题。希望对您有所帮助!

    【讨论】:

      【解决方案2】:
      .map { (user) -> (U) in
      

      这定义了你在闭包中得到一个user,并且必须返回一个U。在您的示例中,您希望返回 User(因此将 U 更改为 User)。

      如果您想创建用户(如果是nil),您可能还想将其存储在数据库中?如果是这种情况,您必须将 map 更改为 flatMap 并像这样更新:

      .flatMap { (user) -> EventLoopFuture<User> in
        if user == nil {
          return User(fbId: fbId).save(on: req)
        }
        return req.future(user)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 2017-05-28
        • 2017-04-08
        • 2015-07-31
        • 2018-10-02
        相关资源
        最近更新 更多