蒸气3-搜索失败时返回另一个Future?

时间:2018-08-03 09:32:15

标签: swift vapor

我正在使用Vapor 3并链接到FoundationDB数据库,所以我不使用Fluent。我有一个搜索记录的方法,但是如果不返回记录,它显然会崩溃(因为我强行解开该值)。

我想保护从数据库中读取的内容,如果找不到记录,则返回响应。但是,这将不会是将来预期的记录。我当时以为我应该返回不同的响应,但是不确定如何更改预期的结果。

//creates a specific country
func getCountry( req: Request) throws -> Future<Country> {
    // get Country name from get parameter string
    let countryString = try req.parameters.next(String.self)


    // get record from Database. This could fail and so needs to be guarded. What response should be returned as the Future requires a Country datatype?

       let record =  FDBConnector().getRecord(path: Subspace("iVendor").subspace(["Countries", countryString]))



    let newCountry = try JSONDecoder().decode(Country.self, from: record!)
    // return Country Struct
    return Future.map(on: req) {return newCountry }

}

1 个答案:

答案 0 :(得分:6)

这里有两个选择。

首先,如果您从方法中抛出错误:

guard let record =  FDBConnector().getRecord(path: Subspace("iVendor").subspace(["Countries", countryString])) else {
    throw Abort(.notFound, reason: "No country found with name \(countryString)")
}

该错误将转换为带有"No country found with name \(countryString)"作为错误消息的404(未找到)响应。

如果您想更好地控制结果响应,可以将路由处理程序的返回类型更改为Future<Response>。然后,您可以将Country对象编码为响应或创建自定义错误响应。但是,此方法确实需要一些额外的工作。

let response = Response(using: req)
guard let record =  FDBConnector().getRecord(path: Subspace("iVendor").subspace(["Countries", countryString])) else {
    try response.content.encode(["message": "Country not found"])
    response.http.status = .notFound
    return response
}

try response.content.encode(record)
return response

请注意,如果您希望该代码段正常工作,则必须使CountryContent相符。