繁体   English   中英

Swift Vapor为自定义响应添加其他信息

[英]Swift Vapor add additional info to custom response

我有两个型号,旅行和位置。 我会返回一个带有一些旅行领域的自定义响应,以及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是这样的(用蒸汽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. 将行程映射到他们的tripIds以获取一系列tripIds
  2. 获取上述数组中tripId之一的tripId的所有位置
  3. 使用tripId过滤的数据库的位置将每个行程映射到TripCustomContent实例

最后,您不需要自己编码JSON,只需返回符合Content对象:

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


以上可能是您的战略的解决方案。 但是,也许你看一看关系 ,如果他们能够更高效,更容易和更快的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM