我正在做一个流利的小型蒸汽项目。现在我应该能够创建一个用户,为所述创建的用户创建一个令牌并返回带有会话令牌的用户。之后我应该能够登录并创建一个新令牌。
现在的问题是,每当我创建一个令牌时,id
所述令牌的值设置为1
,即使我将它设置为nil
。创建用户时不会发生这种情况,然后自动增量按预期工作。
我使用的数据库是 MySQL。
我的迁移CreateTokens.swift
:
import Fluent
struct CreateTokens: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema(Token.schema)
.field("id", .int, .identifier(auto: true))
.unique(on: "id")
.field("user_id", .int, .references("users", "id"))
.field("value", .string, .required)
.unique(on: "value")
.field("created_at", .datetime, .required)
.field("expires_at", .datetime)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema(Token.schema).delete()
}
}
我的令牌 ( Token.swift
):
import Vapor
import Fluent
final class Token: Model {
static let schema = "tokens"
@ID(custom: "id", generatedBy: .database)
var id: Int?
@Parent(key: "id")
var user: User
@Field(key: "value")
var value: String
@Field(key: "expires_at")
var expiresAt: Date?
@Timestamp(key: "created_at", on: .create)
var createdAt: Date?
init() {}
init(id: Int? = nil,
userId: User.IDValue,
token: String,
expiresAt: Date?
) {
self.id = id
self.$user.id = userId
self.value = token
self.expiresAt = expiresAt
}
}
extension Token: ModelTokenAuthenticatable {
static let valueKey = \Token.$value
static let userKey = \Token.$user
var isValid: Bool {
guard let expiryDate = expiresAt else {
return true
}
return expiryDate > Date()
}
}
在我的用户结构中,当我创建一个令牌时:
func createToken() throws -> Token {
let calendar = Calendar(identifier: .gregorian)
let expiryDate = calendar.date(byAdding: .year, value: 1, to: Date())
let token = try Token(userId: requireID(), token: [UInt8].random(count: 16).base64, expiresAt: expiryDate)
return token
}
如果我在并打印出令牌上设置断点return token
,我会得到以下信息:
(lldb) po token
Token(input: [expires_at: Optional(2021-11-11 21:01:10 +0000), value: "wn8kvw/GYSfqL280RLCDbQ==", id: 1])
ID 值设置为1
,但是在代码中(对我而言)很清楚我已将其设置为nil
. 即使我token.id = nil
在返回之前添加,它仍然设置为1
.
我在这里做错了什么?还是我偶然发现了一个流利的错误?