拦截器响应器(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状态码,提供更加人性化的用户体验。
•开发效率提升:减少重复的异常处理逻辑,专注于业务代码的实现。
•日志记录和监控:方便记录异常信息,便于问题追踪和系统监控。