我正在try 理解如何使用Vapor创建CRUD函数.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)
}
}
返回令牌可能不在那里,因此它应该是可选的,但我得到了熟悉的错误
Initializer for conditional binding must have Optional type, not 'EventLoopFuture<Token?>'个
如果我对documentation的理解正确的话,我显然是在使用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
}
但这给了我与TOKEN相同的错误,包括row.delete(on:_)
方法的另一个错误
Value of type 'EventLoopFuture<Token?>' has no member 'delete'个
我遗漏了什么?
·倾倒在文档上 ·回顾我在教程中的步骤 ·屏住呼吸,直到电脑正常工作