Rumah > hujung hadapan web > tutorial js > Cara Membuat dan Menggunakan Penghias dan Middleware dalam NestJS

Cara Membuat dan Menggunakan Penghias dan Middleware dalam NestJS

Mary-Kate Olsen
Lepaskan: 2025-01-13 06:05:43
asal
207 orang telah melayarinya

Penghias dan perisian tengah ialah roti dan mentega NestJS—alat yang boleh menjadikan hidup anda sama ada sangat mudah atau sedikit menggembirakan, bergantung pada cara anda mendekatinya.

Hari ini, mari kita membuat penghias tersuai dan perisian tengah untuk pengesahan pengguna, sambil memastikan perkara itu ringan dan mudah. Dapatkan kopi anda, dan mari selami!

1. Antara Muka

Pertama, mari kita tentukan antara muka untuk objek pengguna kita.

Ini akan memastikan keselamatan taip dan memastikan IDE kami gembira (dan siapa yang tidak suka IDE gembira?).

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;
}
Salin selepas log masuk

2. Mencipta Penghias Tersuai

Penghias tersuai adalah seperti kanak-kanak yang hebat dalam aplikasi NestJS.

Di sini, kami membuat satu untuk mengambil metadata pengguna daripada objek permintaan.

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;
  },
);
Salin selepas log masuk

Itu sahaja! Penghias ini kini boleh digunakan untuk menarik maklumat pengguna terus dalam kaedah pengawal anda.

How to Create and Use a Decorator and Middleware in NestJS

3. Mencipta Auth Middleware

Sekarang, mari buat AuthGuard untuk melindungi titik akhir kita seperti bouncer maya.

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');
    }
  }
}
Salin selepas log masuk

4. Menambah Metadata untuk Laluan Awam dan Dalaman

Sesetengah laluan harus terbuka (seperti log masuk), dan beberapa laluan mungkin dalaman.

Mari tambah dua penghias ringkas untuk itu.

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);
Salin selepas log masuk

5. Menggunakannya dalam Pengawal

Akhir sekali, berikut ialah cara anda boleh menggunakan semua ini dalam pengawal anda.

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,
    };
  }
}
Salin selepas log masuk

Membungkus

Dan begitulah! Anda telah mencipta penghias tersuai, perisian tengah dan penghias metadata untuk mengurus laluan awam.

Menggunakan alatan ini, anda boleh membina API yang selamat dan teratur dalam NestJS.

Jika ini terasa terlalu berat, ingat—malah Rom tidak dibina dalam sehari, tetapi API anda pasti boleh meningkat dengan lebih pantas!

How to Create and Use a Decorator and Middleware in NestJS

Jangan ragu untuk mengubah suai dan bereksperimen dengan coretan ini.

Langit adalah had dengan NestJS! ?


Saya telah mengusahakan alat yang sangat mudah yang dipanggil LiveAPI.

Ia direka untuk menjadikan dokumentasi API mudah untuk pembangun.

Dengan LiveAPI, anda boleh menjana dokumentasi API interaktif dengan cepat yang membolehkan pengguna melaksanakan API terus daripada penyemak imbas.

How to Create and Use a Decorator and Middleware in NestJS

Jika anda bosan membuat dokumen secara manual untuk API anda, alat ini mungkin menjadikan hidup anda lebih mudah.

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

Dari Lama2 kepada LiveAPI: Membina Dokumentasi API Sangat Mudah (Bahagian II)

Athreya aka Maneshwar untuk Hexmos ・ 14 Dis '24

#webdev #javascript #pengaturcaraan #pemula

Atas ialah kandungan terperinci Cara Membuat dan Menggunakan Penghias dan Middleware dalam NestJS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan