ホームページ >ウェブフロントエンド >jsチュートリアル >NestJS でデコレータとミドルウェアを作成して使用する方法
デコレータとミドルウェアは NestJS の基礎であり、アプローチの仕方に応じて、作業を驚くほど簡単にすることも、少し圧倒することもできるツールです。
今日は、作業を軽く簡単にしながら、ユーザー認証用のカスタム デコレーターとミドルウェアを作成する手順を見てみましょう。コーヒーを飲んで、さあ始めましょう!
まず、ユーザー オブジェクトのインターフェイスを定義しましょう。
これにより、型の安全性が確保され、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; }
カスタム デコレータは、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; }, );
それだけです!このデコレータを使用して、コントローラ メソッドでユーザー情報を直接取得できるようになりました。
次に、仮想バウンサーのようにエンドポイントを保護する 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'); } } }
一部のルートはパブリックである必要があり (ログインなど)、一部は内部である可能性があります。
そのために 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);
最後に、これらすべてをコントローラーで使用する方法を示します。
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 は間違いなくより速く拡張できることを思い出してください。
これらのスニペットを自由に調整して実験してください。
NestJS には限界がありません! ?
私は LiveAPI というとても便利なツールに取り組んでいます。
開発者にとって API ドキュメントを簡単に作成できるように設計されています。
LiveAPI を使用すると、ユーザーがブラウザーから直接 API を実行できるインタラクティブな API ドキュメントを迅速に生成できます。
API のドキュメントを手動で作成するのにうんざりしている場合は、このツールを使用すると作業が楽になるかもしれません。
以上がNestJS でデコレータとミドルウェアを作成して使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。