7

編集
私はこの質問/回答を見てきましたコントローラーjsonからエンティティフィールドを除外する方法
しかし、以下のように-これはすべてのクエリからそのフィールドを除外しています(ユーザー検証を処理しようとすると、パスワードフィールドが除外されますClassSerializerInterceptor を持たないルート/コントローラー メソッドでの findOne リポジトリ クエリ

Nest.js / typeorm 内にエンティティがあります。返された json からパスワード フィールドを除外しようとしていますが、サービス内のリポジトリ クエリからパスワード フィールドを除外していません。例えば:

user.entity.ts:

import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, 
UpdateDateColumn, ManyToOne } from 'typeorm';
import { Exclude } from 'class-transformer';
import { Account } from '../accounts/account.entity';

@Entity()
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column({
    unique: true,
  })
  email: string;

 @Column()
 password: string;
}

auth.controller.ts:

import { Controller, Post, Body, Request, Req, Get, UseInterceptors, ClassSerializerInterceptor, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { IUserRequest } from '../../interfaces/user-request.interface';

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Post('/login')
  async login(@Request() req: Request) {
    const user = await this.authService.checkCredentials(req.body);
    return this.authService.logUserIn(user.id);
  }

  @Get('/profile')
  @UseGuards(AuthGuard())
  @UseInterceptors(ClassSerializerInterceptor)
  async profile(@Request() req: IUserRequest) {
    const profile = await this.authService.getLoggedInProfile(req.user.id);
    return { profile };
  }
}

Exclude()そのようにパスワードに追加すると

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

パスワードは応答に含まれています

Column()パスワードから削除すると、

@Exclude()
password: string;

パスワードは、応答および次のようなすべての内部クエリから除外されます。

const user = await this.userRepository.findOne({ where: { id }, relations: ['account']});

を使用して、これは Nest.js で可能ClassSerializerInterceptorですか?

もしそうなら、正しい方向へのポインタをいただければ幸いです。

4

2 に答える 2

13

操作によっては、プロパティをスキップできます。あなたの場合、次を使用します:

@Column()
@Exclude({ toPlainOnly: true })
password: string;

つまり、パスワードは、クラスが json に変換されたとき (応答を送信したとき) にのみスキップされ、json がクラスに変換されたとき (要求を取得したとき) にはスキップされません。

@UseInterceptors(ClassSerializerInterceptor)次に、コントローラーまたはコントローラー メソッドに を追加します。これにより、返すときにエンティティ クラスが自動的に json に変換されます。


が機能するためClassSerializerInterceptorには、最初にエンティティがクラスに変換されていることを確認してください。ValidationPipeこれは、 オプションとともにを使用する{ transform: true}か、リポジトリ (データベース) からエンティティを返すことによって自動的に実行できます。また、エンティティ自体を返す必要があります。

@Post()
@UseInterceptors(ClassSerializerInterceptor)
addUser(@Body(new ValidationPipe({transform: true})) user: User) {
  // Logs user with password
  console.log(user);
  // Returns user as JSON without password
  return user;
  }

それ以外の場合は、手動で変換する必要があります:

async profile(@Request() req: IUserRequest) {
  // Profile comes from the database so it will be an entity class instance already
  const profile = await this.authService.getLoggedInProfile(req.user.id);
  // Since we are not returning the entity directly, we have to transform it manually
  return { profile: plainToClass(profile) };
}
于 2019-01-23T21:22:58.063 に答える