E-commerce Application(Nest js Microservice) - 3. Auth-Service(2)

6152 ワード

#1パッケージのインストール

npm i class-validator class-transformer
これらのパッケージは、検証用のパッケージです.たとえば、@IsStringというタグを使用して、要求された電子メールがString値であるかどうかを決定できます.

#2 vo, dto, entity


nestjsではdtoに統一されていますが、voとdtoでそれぞれ実現します.
  • request.register.ts
  • import { IsString } from 'class-validator';
    
    export class RequestRegister {
        @IsString()
        @IsNotEmpty()
        readonly email: string;
        
        @IsString()
        @IsNotEmpty()
        readonly password: string;
        
        @IsString()
        @IsNotEmpty()
        readonly nickname: string;
    }
  • request.login.ts
  • import { IsString } from 'class-validator';
    
    export class RequestLogin {
        @IsString()
        @IsNotEmpty()
        readonly email: string;
        
        @IsString()
        @IsNotEmpty()
        readonly password: string;
    }
  • request.update.ts
  • import { IsString } from 'class-validator';
    
    export class RequestUpdate {
        @IsString()
        @IsNotEmpty()
        readonly nickname: string;
    }
  • response.user.ts
  • export class ResponseUser {
        email: string;
        nickname: string;
        encryptedPwd: string;
        userId: string;
    }
  • user.dto.ts
  • import { IsNumber, IsString } from 'class-validator';
    
    export class UserDto {
        @IsNumber()
        id: number;
    
        @IsString()
        email: string;
    
        @IsString()
        password: string;
        
        @IsString()
        nickname: string;
        
        @IsString()
        encryptedPwd: string;
        
        @IsString()
        userId: string;
    }
  • user.entity.ts
  • import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
    
    @Entity()
    export class UserEntity {
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column()
        email: string;
        
        @Column()
        nickname: string;
        
        @Column()
        userId: string;
        
        @Column()
        encryptedPwd: string;
    }
    これらのクラスはリクエストされたvoオブジェクトであり、read-only特性を有する.次に、IsStringという名前のレコーダを使用して、変数がstring値であるかどうかを決定します.しかし、ResponseUserというクラスは、応答に値を追加する必要があるためreadonlyインジケータを追加しないため、最終的にユーザが応答を受信することを可能にするサービス層から戻り値に伝達し続けるクラスである.
    また、dtoクラスはreadonly指示を使用していません.これは、レイヤデータを伝達し、ビジネスロジックを経たデータが変更される必要がある場合にデータを変更する必要があるためです.
    entityクラスは、サービス層がリポジトリの保存方法を呼び出したときにデータベースに格納するオブジェクトです.

    #2 service


    uuidを使用してuserIdを作成するので、次のパッケージをインストールします.
    npm i uuid
    npm i -D @types/uuid
    コントローラは、要求されたデータをdtoクラスに変換し、サービス層を呼び出して関連するビジネスロジックを取得する.例えば、現在実施されているスキームを見てみましょう.
    1)コントローラは、要求レジストラオブジェクトを受信し、そのオブジェクトを使用して、サービス層に送信するためにUserdtoというオブジェクトを作成する.
    2)サービスはこのUserDtoを受信し、実際にデータベースに保存するためにUserEntityオブジェクトを作成します.
    次に、UserEntityでUserDtoから値を取得し、その値をデータベースに格納します.その後、ResponseUserという名前のオブジェクトを作成し、コスト入力が完了したときにユーザーに表示する値を返します.
    コードを見てみましょう.
  • UserController.register
  • @Post('register')
    public async register(@Body() requestRegister: RequestRegister): Promise<ResponseUser> {
        const userDto = new UserDto();
    
        userDto.email = requestRegister.email;
        userDto.password = requestRegister.password;
        userDto.nickname = requestRegister.nickname;
    
        return await this.userService.register(userDto);
    }
  • UserService.register
  • public async register(userDto: UserDto) : Promise<ResponseUser> {  
        try {
            const user = new UserEntity();
    
            user.email = userDto.email;
            user.encryptedPwd = userDto.password + "encrypted";
            user.nickname = userDto.nickname;
            user.userId = uuid();
    
            await this.userRepository.save(user);
                
            const responseUser = new ResponseUser();
    
            responseUser.email = user.email;
            responseUser.encryptedPwd = user.encryptedPwd;
            responseUser.nickname = user.nickname;
            responseUser.userId = user.userId;
    
            return responseUser;
        } catch(err) {
            throw new HttpException(err, HttpStatus.BAD_REQUEST);
        }
    }
    このように会員加入を行う

    #3 user.module.ts, main.ts


    リポジトリを追加するにつれてuser.module.tsにインポートするコード.
  • user.module.ts
  • import { Module } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { UserEntity } from 'src/entity/user.entity';
    import { UserController } from './user.controller';
    import { UserService } from './user.service';
    
    @Module({
      imports: [TypeOrmModule.forFeature([UserEntity])],
      controllers: [UserController],
      providers: [UserService]
    })
    export class UserModule {}
    class-validator、class-transformerパッケージを設定するときに追加するコード.
  • main.ts
  • import { ValidationPipe } from '@nestjs/common';
    import { NestFactory } from '@nestjs/core';
    import { AppModule } from './app.module';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      
      app.useGlobalPipes(
        new ValidationPipe({
          whitelist: true,
          transform: true,
          forbidNonWhitelisted: true,
          transformOptions: {
            enableImplicitConversion: true,
          },
        }),
      );
    
      await app.listen(7000); // on PORT 7000
    }
    
    bootstrap();

    #4レジスタ結果値のチェック






    私たちは合計2回会員登録を行い、データの格納は予想通りです.

    次の記事では、login、認証、認証について説明します。