postgresql - TypeORM 条件可为空?

标签 postgresql nestjs typeorm

我正在使用 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;

(P.S.:对于我当前的代码,我选择使密码只能为空......)

最佳答案

简短的回答是否定的,不是在 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)

如果此实体跨越 Controller ,您还可以使用 NestJS 的 ValidationPipeenforce this at the controller or application级别:

// main.ts
app.useGlobalPipes(new ValidationPipe({ whitelist: true }));

关于postgresql - TypeORM 条件可为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849855/

相关文章:

node.js - 无法连接到数据库 - NEST.JS 和 TypeORM

javascript - @Get ('*' ) 不匹配空 (NestJS)

postgresql - azure + postgresql : How to fix error: Unable to connect to server: server closed the connection unexpectedly

postgresql - ts_vector 之间的交点

node.js - 如何从 typeorm 实体中排除列,并且可以选择使用 Find 方法获取该列

TypeORM - 搜索和填充多对多关系

javascript - NestJS/TypeORM : Cannot set property metadata of#<Repository> which has only a getter

nestjs - 使用 typeorm 和 mysql 的 Nest 框架,列默认属性正在将数据库值修改为每次服务器重新加载时的默认值

eclipse - 添加 postgresql jar 后 Tomcat 不启动

.net - 通过 NpgsqlDataAdapter 的 NpgsqlCommand