nest拦截器/守卫/响应器

236 阅读3分钟

拦截器响应器(Interceptors)

NestJS 拦截器:流程控制的优雅艺术;

NestJS的拦截器为您提供了在整个请求-响应周期中注入通用逻辑的能力。无论是日志记录、事务处理还是权限验证,拦截器都能在请求到达控制器之前或发送响应之后,对流程进行精确控制。通过定义拦截器,您可以轻松实现横切关注点,保持代码的整洁和模块化。

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

import { map } from 'rxjs/operators';
import { Observable } from 'rxjs';
import { requestApi } from '@/utils/RequestApi'; //这里是封装好的数据出参格式可自己封 
@Injectable()
export class ResponseInterceptor<T> implements NestInterceptor<T, Response<T>> {
  intercept(
    context: ExecutionContext,
    next: CallHandler<T>,
  ): Observable<Response<T>> {
    return next.handle().pipe(
      map((data /*返回的数据源 **/) => {

        return requestApi.success(data);
      }),
    );
  }
}

关键点:

•前置/后置处理逻辑

•请求和响应修改

•实现横切关注点

•保持代码清洁和可维护

守卫(Guards)

NestJS 守卫:守护您的路由安全 ;

NestJS守卫是确保只有符合条件的请求才能到达您的处理程序的关键组件。它们用于权限验证、访问控制和其他类型的授权逻辑。通过实现守卫,您可以构建强大的防护层,保护您的应用免受未经授权的访问。

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

@Injectable()
export class AuthGuard implements CanActivate {
  // context 请求的(Response/Request)的引用
  async canActivate(context: ExecutionContext): Promise<boolean> {
    // console.log('进入全局权限守卫...');

    const {
      url,
      headers: { authorization },
    } = context.switchToHttp().getRequest();
    // 如果白名单内的路由就不拦截直接通过
    if (this.whileList.includes(url)) return true;
    // 验证token的合理性以及根据token做出相应的操作
    if (authorization) {
      try {
        // 这里可以添加验证逻辑
        return true;
      } catch (e) {
        throw new HttpException(
          '没有授权访问,请先登录',
          HttpStatus.UNAUTHORIZED,
        );
      }
    } else {
      throw new HttpException('没有授权访问,请先登录', HttpStatus.UNAUTHORIZED);
    }
  }
  // 白名单数组
  private whileList: string[] = [
    '/api/sysUser/login',
    '/api/sysUser/created/user',
  ];
}

关键点:

•验证请求权限

•控制访问策略

•集成认证机制

•增强应用安全性

响应器(HttpExceptionFilter)

NestJS HttpExceptionFilter:优雅地处理每一个异常 ;

在Web应用开发中,异常处理是不可或缺的一环。NestJS的HttpExceptionFilter提供了一个全局的、集中的方式来处理HTTP异常。当异常发生时,它能够捕获这些错误,并以一种优雅、统一的形式向客户端返回友好的错误响应。告别杂乱的错误堆栈,拥抱清晰、可维护的异常处理流程。

import {
  ExceptionFilter,
  Catch,
  ArgumentsHost,
  HttpException,
} from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter<HttpException> {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    const status = exception.getStatus();


    response.status(200).json({
      code: status || -200,
      data: null,
      msg: exception.message,
    });
  }
}

关键点:

•全局异常捕获:统一处理所有路由中的HTTP异常。

•定制化响应:自定义异常信息和HTTP状态码,提供更加人性化的用户体验。

•开发效率提升:减少重复的异常处理逻辑,专注于业务代码的实现。

•日志记录和监控:方便记录异常信息,便于问题追踪和系统监控。