如何在NestJS全局验证器CustomValidationPipe中使用自定义日志器CustomLogger
如何在NestJS全局验证器CustomValidationPipe中使用自定义日志器CustomLogger
嘿,刚接触NestJS的话确实会碰到这种依赖注入的小困扰,我给你分享几个实用的解决方案,帮你把自定义日志器用到验证管道里:
方案一:通过依赖注入让管道获取日志器
这种方法更贴合NestJS的依赖注入设计思想,步骤如下:
把CustomValidationPipe改成可注入的类
在管道类上加上@Injectable()装饰器,然后在构造函数里注入你的CustomLogger:import { Injectable, PipeTransform, ArgumentMetadata, HttpException } from '@nestjs/common'; import { CustomLogger } from './path-to-your-custom-logger'; // 替换成你的日志器实际路径 @Injectable() export class CustomValidationPipe implements PipeTransform { // 构造函数注入自定义日志器 constructor(private readonly logger: CustomLogger) {} transform(value: any, metadata: ArgumentMetadata) { // 现在可以直接用this.logger调用日志方法了 this.logger.log(`开始验证${metadata.type}类型的参数: ${metadata.data}`, CustomValidationPipe.name); try { // 这里写你的验证逻辑,比如结合class-validator的处理代码 const validatedData = /* 你的验证逻辑实现 */; return validatedData; } catch (error) { // 用自定义日志器记录验证错误详情 this.logger.error( `验证失败: ${error.message}`, error.stack, CustomValidationPipe.name ); throw new HttpException('请求参数验证失败', 400); } } }在bootstrap中从容器获取管道实例
因为是全局注册管道,不能直接new(那样没法触发依赖注入),所以要从Nest的容器里拿到已经注入了日志器的管道实例:async function bootstrap() { try { const app = await NestFactory.create(AppModule, { bufferLogs: true, }); const logger = app.get(CustomLogger); app.useLogger(logger); // 从容器获取带有日志器的验证管道实例 const validationPipe = app.get(CustomValidationPipe); app.useGlobalPipes(validationPipe); await app.listen(3000); logger.log('应用启动成功,监听端口3000'); } catch (error) { console.error('应用启动失败', error); } }
方案二:直接把日志器实例传给管道构造函数
如果你不想把管道改成可注入类,也可以直接在bootstrap里把日志器实例传给管道:
修改CustomValidationPipe的构造函数
让管道接受一个日志器参数并保存:import { PipeTransform, ArgumentMetadata, HttpException } from '@nestjs/common'; import { CustomLogger } from './path-to-your-custom-logger'; export class CustomValidationPipe implements PipeTransform { private readonly logger: CustomLogger; constructor(logger: CustomLogger) { this.logger = logger; } transform(value: any, metadata: ArgumentMetadata) { this.logger.warn(`正在验证参数: ${JSON.stringify(value)}`); // 你的验证逻辑实现... return value; } }在bootstrap中实例化管道时传入日志器
async function bootstrap() { try { const app = await NestFactory.create(AppModule, { bufferLogs: true, }); const logger = app.get(CustomLogger); app.useLogger(logger); // 直接把日志器实例传给管道 app.useGlobalPipes(new CustomValidationPipe(logger)); await app.listen(3000); } catch (error) { console.error('启动出错', error); } }
小提示
因为你设置了bufferLogs: true,Nest会把启动过程中的日志缓冲起来,直到你调用app.useLogger(logger)之后才会输出,所以不用担心日志顺序或者丢失的问题~
备注:内容来源于stack exchange,提问作者Tiziano
相关产品推荐
相关产品推荐

