查询如何在 Vapor 中工作?

Posted

技术标签:

【中文标题】查询如何在 Vapor 中工作?【英文标题】:How query works in 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
        
    

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于查询如何在 Vapor 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使“LIKE”查询在 MongoDB 中工作?

运行队列如何在 Snowflake 中工作?是不是有概念时间片?

如何让这个媒体查询在三星 Galaxy Note4 上的不同浏览器中工作相同?

Freetext() 如何在索引服务中工作?

如何从数据库中获取数据以及会话如何在 laravel 中工作? [复制]

联接如何在 Cloud Spanner 数据库中工作?