在创建时继承范围
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 挂钩就不会更新您的模型实例。因此,可以在不影响创建的模型的情况下更改和更新属性。
我对续集并尝试将其与 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 挂钩就不会更新您的模型实例。因此,可以在不影响创建的模型的情况下更改和更新属性。