首頁 >web前端 >js教程 >如何在 NestJS 中建立和使用裝飾器和中間件

如何在 NestJS 中建立和使用裝飾器和中間件

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-13 06:05:43252瀏覽

裝飾器和中間件是 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. 建立Auth中間件

現在,讓我們建立一個 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. 新增公共和內部路由的元數據

有些路由應該是公共的(例如登入),有些可能是內部的。

讓我們為此添加兩個簡單的裝飾器。

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 文件(第二部分)

Hexmos 的 Athreya 又名 Maneshwar ・ 2024 年 12 月 14 日

#webdev #javascript #程式設計 #初學者

以上是如何在 NestJS 中建立和使用裝飾器和中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:蹄它下一篇:蹄它