我正在使用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 }
}
答案 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
请注意,如果您希望该代码段正常工作,则必须使Country
与Content
相符。