查询如何在 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<User>
,与User
不一样。
所以要回答你的问题,U
应该有User
,但你真的想将first().map
更改为first().flatMap
在这种情况下U
变为Future<User>
。然后您可以执行以下操作:
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 中工作?的主要内容,如果未能解决你的问题,请参考以下文章
运行队列如何在 Snowflake 中工作?是不是有概念时间片?
如何让这个媒体查询在三星 Galaxy Note4 上的不同浏览器中工作相同?