在创建时继承范围

Sequelize scope on create

我对续集并尝试将其与 sequelize-typescript 一起使用还很陌生。

我有一个这样的用户模型:

@Scopes(() => ({
    authenticated: {
        attributes: {
            exclude: ["password", "email" /* more .. */]
        }
    }
}))
export default class User extends Model<IUser, UserOnCreate> implements IUser {
    @PrimaryKey
    @AutoIncrement
    @Column(DataType.INTEGER)
    declare id: number

    @Unique
    @Column(DataType.STRING(20))
    declare username: string

    @Column(DataType.STRING(64))
    get password(): string { return this.getDataValue("password") }
    set password(p: string) { /* some hashing algorithms */ }

    // more columns...
}

还有一个认证用户类型,

type AuthenticatedUser = Omit<IUser, | "password" | "email" /* more */>

而且,我正在使用以下代码创建一个新用户:

await new User(credentials, { raw: true }).save()

那么有没有更简单的方法在创建时应用 authenticated 范围?

经过一些搜索和浏览文档后,找不到任何东西。

因此,为不需要的键定义一个数组:

export const authenticableExclude = ["id", "updatedAt", "createdAt", "email"] 

并定义一个@AfterCreate 钩子并将这些键设置为undefined

@AfterCreate
static async editLikeScope(i: User) {
    Object.keys(i.get()).forEach((k) => { 
        if (authenticatedExclude.includes(k)) i.set(k as (keyof IUser), undefined)
    })
}

就是这样。
PS: 主要思想是,只要您不调用 .save() 方法,@AfterCreate 挂钩就不会更新您的模型实例。因此,可以在不影响创建的模型的情况下更改和更新属性。