Создание функций 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?>» не имеет члена «удалить»

Что мне не хватает?

• Пролистываю документацию • Повторяю шаги из учебника • Затаив дыхание, пока компьютер не заработал

0 ответов

Другие вопросы по тегам