我正在使用TypeORM和Postgres在NestJS中开发一个登录系统。在我的登录选项中,我建议用户使用几封电子邮件/密码或使用OAuth身份验证。但是,一旦创建了帐户,它们就不会相互排斥(例如,用户可以将电子邮件+密码和Google帐户附加到其帐户中)。
因此,我想使密码或OAuthLogin可以为空,但是其中至少一个永远不能为空。
使用TypeORM是否可以实现此目的?
@Entity()
class User {
@PrimaryGeneratedColumn()
public id: number;
@Column({ unique: true })
public email: string;
@Column({ nullable: true })
@Exclude()
public password?: string;
@JoinColumn()
@OneToMany(() => OAuthLogin, (provider: OAuthLogin) => provider.user, {
cascade: true,
})
public oAuthLogins: OAuthLogin[];
}
export default User;
(PS:对于我当前的代码,我选择使密码只能为空...)
简短的答案是“否”,而不是在TypeORM级别。但是,您可以使用以下代码中的ValidateIf
装饰器在应用程序代码中实现此目标class-validator
:
@Column({ nullable: true })
@Exclude()
@IsNotEmpty()
@ValidateIf(u => !u.oAuthLogins || u.oAuthLogins.length === 0)
public password?: string;
@JoinColumn()
@IsArray()
@ValidateIf(u => !u.password)
@OneToMany(() => OAuthLogin, (provider: OAuthLogin) => provider.user, {
cascade: true,
})
public oAuthLogins?: OAuthLogin[];
您的应用程序中的其他地方:
import { validate } from 'class-validator';
...
validate(user)
如果这个实体渡控制器,你也可以使用NestJS的ValidationPipe
,以在控制器或应用程序执行本级别:
// main.ts
app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句