gpt4 book ai didi

Swift Vapor 向自定义响应添加附加信息

转载 作者:搜寻专家 更新时间:2023-10-31 22:37:14 25 4
gpt4 key购买 nike

我有两个模型,Trip 和 Location。我会返回一个自定义响应,其中包含一些旅行字段以及 tripID 等于 Trip id 的 Location 数量。有我的代码(不工作)。字段 locationCount 始终为空。

func getList(_ request: Request)throws -> Future<Response> {

let deviceIdReq = request.parameters.values[0].value
let queryTrips = Trip.query(on: request).filter(\.deviceId == deviceIdReq).all()
var tripsR = [TripCustomContent]()
var trips = [Trip]()

return queryTrips.flatMap { (result) -> (Future<Response>) in
trips = result

var count = 0
for t in trips {
let tripIdString = String(t.id!)
let v = Location.query(on: request).filter(\.tripID == tripIdString).count().map({ (res) -> Int in
return res
})/*.map{ (result) -> (Int) in
count = result
return result
}*/
let tripCustomContent = TripCustomContent.init(startTimestamp: t.startTimestamp, endTimestamp: t.endTimestamp, deviceId: t.deviceId, locationCount: v)
tripsR.append(tripCustomContent)
}
let jsonEncoder = JSONEncoder()
let data = try jsonEncoder.encode(tripsR)
let response = HTTPResponse.init(status: .ok, version: HTTPVersion.init(major: x, minor: y), headers: HTTPHeaders.init(), body: data)
let finalResponse = Response.init(http: response, using: request)
return try g.encode(for: request)
}
}

这是我的自定义内容结构:

struct TripCustomContent: Encodable {
var startTimestamp: String?
var endTimestamp: String?
var deviceId: String
var locationCount: Future<Int>
}

有什么建议吗?

最佳答案

您正在尝试使用一个尚不可用的值。当您退回 Future 时,您不会返回其中的值。

所以你想要你的 TripCustomContent像这样(在 Steam 中使用 Content 而不是 Codable :

struct TripCustomContent: Content {
var startTimestamp: String?
var endTimestamp: String?
var deviceId: String
var locationCount: Int
}

您查询了 Trip正确,但不是 Location .你也许可以尝试这样的事情:

return queryTrips.flatMap { trips -> Future<[TripCustomContent]> in
let tripIds = trips.map({ String($0.id!) })
return Location.query(on: request).filter(\.tripID ~~ tripIds).all().map { locations in
return trips.map { trip in
let locationCount = locations.filter({ $0.tripId == String(trip.id!) }).count
return TripCustomContent(... locationCount: locationCount)
}
}
}

我在这里做了什么?

  1. 将行程映射到他们的 tripId 以获得 tripId 数组
  2. 获取 tripId 为上述数组中 tripId 之一的所有位置
  3. 将每个行程映射到 TripCustomContent 的一个实例,使用由 tripId 过滤的数据库位置

最后,不需要自己对JSON进行编码,只需要返回符合Content的对象即可:

func getList(_ request: Request) throws -> Future<[TripCustomContent]>


以上可能是您策略的解决方案。但也许你看看relations如果它们可以成为一种更高效、更简单、更快捷的方式。

关于Swift Vapor 向自定义响应添加附加信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com