返回

NestJS 基本理论(上): 解密 NestJS 的核心机制

前端

  1. NestJS 控制器

NestJS 控制器是处理 HTTP 请求的类。控制器通常负责处理路由和业务逻辑。在 NestJS 中,控制器使用 @Controller() 装饰器进行装饰。例如:

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll() {
    return 'This action returns all cats';
  }
}

2. NestJS 提供者

NestJS 提供者是向控制器和其他组件提供依赖项的类。提供者通常使用 @Injectable() 装饰器进行装饰。例如:

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

@Injectable()
export class CatsService {
  findAll() {
    return 'This action returns all cats';
  }
}

3. NestJS 模块

NestJS 模块是将相关组件组合在一起的逻辑分组。模块通常使用 @Module() 装饰器进行装饰。例如:

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

4. NestJS 中间件

NestJS 中间件是在请求处理过程中执行的函数。中间件通常用于日志记录、身份验证和授权。在 NestJS 中,中间件使用 @Middleware() 装饰器进行装饰。例如:

import { MiddlewareConsumer, NestMiddleware } from '@nestjs/common';

export class LoggerMiddleware implements NestMiddleware {
  use(req, res, next) {
    console.log('Request...');
    next();
  }
}

export function logger(consumer: MiddlewareConsumer) {
  consumer.apply(LoggerMiddleware).forRoutes('*');
}

5. NestJS 异常处理

NestJS 异常处理用于处理请求处理过程中发生的错误。在 NestJS 中,异常处理使用 @Catch() 装饰器进行装饰。例如:

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();
    const status = exception.getStatus();

    response.status(status).json({
      statusCode: status,
      timestamp: new Date().toISOString(),
      path: request.url,
      error: exception.message,
    });
  }
}

6. NestJS 管道

NestJS 管道是在请求处理过程中对请求和响应进行转换的函数。管道通常用于验证、解析和格式化数据。在 NestJS 中,管道使用 @Pipe() 装饰器进行装饰。例如:

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class TrimPipe implements PipeTransform {
  transform(value: string, metadata: ArgumentMetadata) {
    return value.trim();
  }
}

7. NestJS 守卫

NestJS 守卫是在请求处理过程中对请求进行授权的函数。守卫通常用于检查用户是否具有访问特定资源的权限。在 NestJS 中,守卫使用 @Guard() 装饰器进行装饰。例如:

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    return request.isAuthenticated();
  }
}

8. NestJS 拦截器

NestJS 拦截器是在请求处理过程中对请求和响应进行拦截的函数。拦截器通常用于日志记录、性能监控和错误处理。在 NestJS 中,拦截器使用 @Intercept() 装饰器进行装饰。例如:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...');

    const now = Date.now();
    const request = context.switchToHttp().getRequest();

    return next
      .handle()
      .pipe(
        tap(() => console.log(`After... ${Date.now() - now}ms`)),
      );
  }
}

9. NestJS 装饰器

NestJS 装饰器是向类、方法和属性添加元数据的函数。装饰器通常用于配置组件、注入依赖项和处理异常。在 NestJS 中,装饰器使用 @ 符号进行装饰。例如:

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll() {
    return 'This action returns all cats';
  }
}

在本文中,我们讨论了 NestJS 的核心机制,包括控制器、提供者、模块、中间件、异常处理、管道、守卫和拦截器。这些机制为构建高性能、可扩展的服务器端应用程序提供了强大的基础。