我有两个型号,旅行和地点。我将返回一个自定义响应,其中包含一些trip字段和tripID等于trip ID的位置编号。有我的代码(不工作)。字段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
是这样的(用在vapor中而不是Content
:
struct TripCustomContent: Content {
var startTimestamp: String?
var endTimestamp: String?
var deviceId: String
var locationCount: Int
}
您正确地查询了
Codable
,但没有查询到Trip
。你可以尝试这样的方法: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)
}
}
}
我在这里做了什么?
将旅行映射到它们的tripID以获取tripID数组
获取上面数组中tripID为其中一个tripID的所有位置
使用数据库的位置将每个行程映射到
Location
的一个实例,该位置由TripCustomContent
筛选最后,您不需要自己对JSON进行编码,只需返回符合以下条件的对象:
tripId
以上可能是你策略的解决方案。但如果他们能更有效、更简单和更快的方式,也许你可以看看relations。
关于swift - Swift Vapor为自定义响应添加其他信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54724090/