gpt4 book ai didi

swift - 创建实例集 id,尽管它应该为零

转载 作者:行者123 更新时间:2023-12-02 02:32:46 24 4
gpt4 key购买 nike

我正在使用 Fluent 开发一个小型 Vapor 项目。现在我应该能够创建一个用户,为所述创建的用户创建一个 token ,并使用 session token 返回该用户。之后我应该能够登录并创建一个新 token 。

现在的问题是,每当我创建一个 token 时,该 token 的 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 (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()
}
}

在我的用户结构中,当我创建 token 时:

    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
}

如果我在返回 token 上设置断点并打印出 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

我在这里做错了什么?或者我偶然发现了一个流畅的错误?

最佳答案

正如您所提到的,键“id”似乎同时用于 iduser 属性,这是此类中常见的错误类型字符串类型 API。

我尝试缓解此问题的一种方法是扩展 FieldKey 并强制自己始终使用这些静态属性而不是字符串,这样 IDE 的自动完成功能就可以提供让我有机会考虑使用正确的字段键 - 当您手动键入这些键时,会缺少一些东西。

extension FieldKey {
static var userID: FieldKey { "user_id" }
}

// And in the model
@Parent(key: .userID)
var user: User

希望这对将来有所帮助!

关于swift - 创建实例集 id,尽管它应该为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64794208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com