是否可以“保护”属性并将其从选择语句中排除

Hig*_*don 11 typeorm

我想在数据层级别保护某些属性。例如,我想保护我为用户存储在数据库中的密码哈希,这样它就不会出现在任意的select语句中。

仅当在select property, property2语句中明确请求时才采用这种方式。

nom*_*oda 32

我认为更准确的答案是设置select: false列选项:

@Column({ select: false })
password: string;
Run Code Online (Sandbox Code Playgroud)

并明确选择这样的列:

const user = await getRepository(User)
    .createQueryBuilder()
    .addSelect('password')
    .getOne()
Run Code Online (Sandbox Code Playgroud)

  • 这是问题的正确答案。以下是文档的链接:[hidden-columns](https://typeorm.io/#/select-query-builder/hidden-columns)。尽管如此,接受的答案是一个有效的解决方案。 (2认同)

NoN*_*ded 8

TypeORM 与路由控制器配合得很好,所以你应该使用它,在幕后它使用类转换器来序列化和反序列化你的数据。因此,您可以使用该@Exclude库中的装饰器来防止将某些属性发送给客户端。

当在控制器函数中将数据指定为类型时,它还使用类验证器库来验证数据。这些是强大的玩具。下面是一个关于如何利用两者的小例子:

import { Entity, Column, PrimaryGeneratedColumn, Index, OneToMany } from "typeorm";
import { Exclude, Expose } from "class-transformer";
import { IsNotEmpty, IsEmail, MinLength, MaxLength, Min, Max, IsNumber, IsString } from "class-validator";

@Entity()
export class User extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsNotEmpty()
  @IsEmail()
  @Index({ unique: true })
  email: string;

  @Exclude()
  @Column()
  passwordHash: string;

  @Column()
  @IsNotEmpty()
  @IsString()
  firstName: string;

  @Column()
  @IsNotEmpty()
  @IsString()
  lastName: string;

  @Column({ type: 'integer', default: Gender.NotSpecified })
  @IsNumber()
  @Min(1)
  @Max(3)
  gender: Gender;


  @Expose()
  get admin() {
    return this.role == Role.Admin;
  }

  @Expose()
  get stylist() {
    return this.role == Role.Stylist;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用另一个服务器端库,您仍然可以利用class-transformerclass-validator。你只需要在你的路由中手动调用验证函数,例如对于 restify 你可以这样写:

import {validate } from "class-validator";
import {plainToClass} from "class-transformer";
// ... more code

server.post('/hello', function create(req, res, next) {
   let bodyJSON = parseBodyTheWayYouWant(req.body);
   let post = plainToClass(bodyJSON);
   validate(post)
   return next();
});
Run Code Online (Sandbox Code Playgroud)