ホームページ >ウェブフロントエンド >jsチュートリアル >NestJS でデコレータとミドルウェアを作成して使用する方法

NestJS でデコレータとミドルウェアを作成して使用する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-13 06:05:43205ブラウズ

デコレータとミドルウェアは NestJS の基礎であり、アプローチの仕方に応じて、作業を驚くほど簡単にすることも、少し圧倒することもできるツールです。

今日は、作業を軽く簡単にしながら、ユーザー認証用のカスタム デコレーターとミドルウェアを作成する手順を見てみましょう。コーヒーを飲んで、さあ始めましょう!

1. インターフェース

まず、ユーザー オブジェクトのインターフェイスを定義しましょう。

これにより、型の安全性が確保され、IDE が快適に保たれます (そして、幸せな IDE を好まない人はいないでしょうか?)。

export interface IUser {
  id: string;
  name: string;
  primaryEmail: string;
  phoneNumber: string | null;
  countryCode: string | null;
  dob: Date | null;
  createdAt: Date;
  updatedAt?: Date;
  deletedAt?: Date | null;
}

2. カスタムデコレータの作成

カスタム デコレータは、NestJS アプリケーションのクールな子供のようなものです。

ここでは、リクエスト オブジェクトからユーザー メタデータを取得するものを作成しています。

import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { IUser } from '../interface/user.interface';

export const UserMetadata = createParamDecorator(
  (_data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user as IUser;
  },
);

それだけです!このデコレータを使用して、コントローラ メソッドでユーザー情報を直接取得できるようになりました。

How to Create and Use a Decorator and Middleware in NestJS

3. 認証ミドルウェアの作成

次に、仮想バウンサーのようにエンドポイントを保護する AuthGuard を作成しましょう。

import {
  CanActivate,
  ExecutionContext,
  ForbiddenException,
  Injectable
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { verify } from 'jsonwebtoken';
import { Observable } from 'rxjs';
import { IS_PUBLIC_KEY } from '../constant/core';
import { IUser } from '../interface/user.interface';

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(
    private reflector: Reflector,
  ) { }

  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);
    if (isPublic) {
      return true;
    }

    const request = context.switchToHttp().getRequest();
    const headers = request.headers;

    const token = (headers['authorization'] || '').split(' ')[1];
    if (!token) {
      throw new ForbiddenException('Not Authenticated');
    }

    const jwtOpts = {
      expiresIn: '1h', // Replace with env vars in real use
      audience: 'your-audience',
      algorithm: 'HS256',
      issuer: 'your-issuer',
    };

    try {
      const decoded = verify(token, "my-jwt-secret-token", {
        audience: jwtOpts.audience,
        issuer: jwtOpts.issuer,
      }) as { user: IUser };

      request.user = decoded.user;
      return true;
    } catch (err) {
      throw new ForbiddenException('Session Expired or Invalid');
    }
  }
}

4. パブリックルートと内部ルートのメタデータの追加

一部のルートはパブリックである必要があり (ログインなど)、一部は内部である可能性があります。

そのために 2 つの単純なデコレータを追加しましょう。

import { SetMetadata } from '@nestjs/common';

export const IS_PUBLIC_KEY = 'isPublic';
export const IS_INTERNAL = 'isInternal';

export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
export const Internal = () => SetMetadata(IS_INTERNAL, true);

5. コントローラーでの使用

最後に、これらすべてをコントローラーで使用する方法を示します。

import { Controller, Get, UseGuards } from '@nestjs/common';
import { UserMetadata } from '../decorators/user.decorator';
import { AuthGuard } from '../guards/auth.guard';
import { Public } from '../decorators/public.decorator';

@Controller('users')
export class UserController {

  @Public()
  @Get('login')
  login() {
    return { message: 'Login endpoint (public)' };
  }

  @UseGuards(AuthGuard)
  @Get('profile')
  getProfile(@UserMetadata() user: IUser) {
    return {
      message: 'User Profile',
      user,
    };
  }
}

まとめ

これで完成です!パブリック ルートを管理するためのカスタム デコレータ、ミドルウェア、およびメタデータ デコレータを作成しました。

これらのツールを使用すると、NestJS で安全で組織化された API を構築できます。

これが多すぎると感じた場合は、ローマでさえ一日にして成らず、API は間違いなくより速く拡張できることを思い出してください。

How to Create and Use a Decorator and Middleware in NestJS

これらのスニペットを自由に調整して実験してください。

NestJS には限界がありません! ?


私は LiveAPI というとても便利なツールに取り組んでいます。

開発者にとって API ドキュメントを簡単に作成できるように設計されています。

LiveAPI を使用すると、ユーザーがブラウザーから直接 API を実行できるインタラクティブな API ドキュメントを迅速に生成できます。

How to Create and Use a Decorator and Middleware in NestJS

API のドキュメントを手動で作成するのにうんざりしている場合は、このツールを使用すると作業が楽になるかもしれません。

How to Create and Use a Decorator and Middleware in NestJS
How to Create and Use a Decorator and Middleware in NestJS

Lama2 から LiveAPI へ: 超便利な API ドキュメントの構築 (パート II)

Athreya aka Maneshwar for Hexmos ・ 2024 年 12 月 14 日

#webdev #javascript #プログラミング #初心者

以上がNestJS でデコレータとミドルウェアを作成して使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:フーフ・イット次の記事:フーフ・イット