Создание функций CRUD с использованием Async-Await с Vapor-Fluent — Swift 5.6
Я пытаюсь понять, как создавать функции CRUD с помощью Vapor. Кажетсяfirst()
является необязательным, но не может быть развернут как необязательный тип
func first() -> EventLoopFuture<Token?>
Вот мойToken.swift
import Foundation
import Fluent
import Vapor
final class Token: Model {
// 1
static let schema = "tokens"
// 2
@ID(key: .id)
var id: UUID?
// 3
@Field(key: "token")
var token: String
@Field(key: "debug")
var debug: Bool
// 4
init() { }
init(token: String, debug: Bool) {
self.token = token
self.debug = debug
}
}
Вот мойTokenController.swift
import Foundation
import Fluent
import Vapor
struct TokenController {
func create(req: Request) async throws -> HTTPStatus {
let token = try req.content.decode(Token.self)
try await token.create(on: req.db)
return .created
}
func delete(req: Request) async throws -> HTTPStatus {
guard let token = req.parameters.get("token") else {
return .badRequest
}
try await Token.query(on: req.db)
.filter(\.$token == token)
.first()
try await delete(req: req.db)
return .noContent
}
}
@available(macOS 12, *)
extension TokenController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
let tokens = routes.grouped("token")
tokens.post(use: create)
tokens.delete(":token", use: delete)
}
}
Токена возврата может не быть, поэтому он должен быть необязательным, но я получаю знакомую ошибку
Инициализатор для условной привязки должен иметь необязательный тип, а не 'EventLoopFuture<Token?>'
Я использую async-await, очевидно, а неEventLoopFuture<>
разве что под капотом, если я правильно понимаю документацию .
На основе учебника, которому я следую, это было предложено в качестве решения для удаления строк путем получения первой строки в таблице.
func delete(req: Request) async throws -> HTTPStatus {
guard let token = req.parameters.get("token") else {
return .badRequest
}
guard let row = try await Token.query(on: req.db)
.filter(\.$token == token)
.first()
else {
return .notFound
}
try await row.delete(on: req.db)
return .noContent
}
Но это дает мне ту же ошибку для токена, включая другую ошибку дляrow.delete(on:_)
метод
Значение типа «EventLoopFuture<Token?>» не имеет члена «удалить»
Что мне не хватает?
• Пролистываю документацию • Повторяю шаги из учебника • Затаив дыхание, пока компьютер не заработал