Я хочу добавить маршрут для получения сопоставленных данных путем поиска определенной строки c. Я добавил маршрут в routes(_:)
в routes.swift .
import Fluent
import Vapor
func routes(_ app: Application) throws {
// route "api/acronyms/search?term=The+string+searched
app.get("search") { req -> EventLoopFuture<[Acronym]> in
guard let searchTerm = req.query[String.self, at: "term"] else {
throw Abort(.badRequest)
}
return Acronym.query(on: app.db)
.group(.or) { group in
group
.filter(\.$short == searchTerm)
.filter(\.$long == searchTerm)
}
.all()
}
}
И это работает. Я хочу переместить его в контроллер. Итак, я создал функцию-обработчик в контроллере.
import Vapor
import Fluent
struct AcronymsController: RouteCollection {
let app: Application
func boot(routes: RoutesBuilder) throws {
routes.get("search", use: search)
}
func search(req: Request) throws -> EventLoopFuture<[Acronym]> {
guard let searchTerm = req.query[String.self, at: "term"] else {
throw Abort(.badRequest)
}
return Acronym.query(on: app.db)
.filter(\Acronym.$short == searchTerm)
.filter(\Acronym.$long == searchTerm)
.all()
}
}
Но я получил ошибку компилятора Swift: Binary operator '==' cannot be applied to operands of type 'KeyPath<Acronym, FieldProperty<Acronym, String>>' and 'String'
.
Почему filter
с оператором ==
не работает в контроллер?
Окружающая среда
- Vapor 4.27.1 (набор инструментов 18.2.1)
- Swift 5.2.4
- macOS Catalina 10.15.6