Nestjs 日志响应数据对象

Posted

技术标签:

【中文标题】Nestjs 日志响应数据对象【英文标题】:Nestjs log response data object 【发布时间】:2020-03-17 03:39:15 【问题描述】:

我想在 NestJs 中记录传入的请求和传出的响应。我从这里Logging request/response in Nest.js 和文档NestJs Aspect Interception 获取信息。

不使用外部包来实现这一点会很棒,所以我更喜欢原生的“Nest”解决方案。

对于我目前使用此代码的请求日志记录

@Injectable()
export class RequestInterceptor implements NestInterceptor 
  private logger: Logger = new Logger(RequestInterceptor.name);

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> 
    const 
      originalUrl,
      method,
      params,
      query,
      body,
     = context.switchToHttp().getRequest();

    this.logger.log(
      originalUrl,
      method,
      params,
      query,
      body,
    );

    return next.handle();
  

这将为GET /users 记录以下结果

我还想记录传出响应。目前我使用这个拦截器

@Injectable()
export class ResponseInterceptor implements NestInterceptor 
  private logger: Logger = new Logger(ResponseInterceptor.name);

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> 
    const  statusCode  = context.switchToHttp().getResponse();

    return next.handle().pipe(
      tap(() =>
        this.logger.log(
          statusCode,
        ),
      ),
    );
  

这将为GET /users 记录以下结果

但是我怎样才能访问发回给客户端的数据呢?

【问题讨论】:

【参考方案1】:

首先,我建议将它们组合到一个记录器中,这样所有的记录逻辑都在一个地方。

其次,要获取回传给客户端的数据,在你的tap函数中你需要给函数添加一个参数,通常我们称之为数据,这样你就可以知道回传的是什么。这有点被 Nest 掩盖了,因为 observable 的工作并不是很清楚,但最终,这样的事情最终会为你工作:

@Injectable()
export class AspectLogger implements NestInterceptor 
  intercept(context: ExecutionContext, next: CallHandler) 
    const req = context.switchToHttp().getRequest();
    const  statusCode  = context.switchToHttp().getResponse();
    const  originalUrl, method, params, query, body  = req;

    console.log(
      originalUrl,
      method,
      params,
      query,
      body,
    );

    return next.handle().pipe(
      tap((data) =>
        console.log(
          statusCode,
          data,
        )
      )
    );
  

如果您决定将其拆分为两个单独的拦截器,这也将起作用,但拥有一个也可以更容易地确定调用时间。

【讨论】:

格式化的响应正文记录器对我不起作用,我必须将其写为 return next.handle().pipe(tap(data =&gt; console.log( statusCode, data ))); 以防其他人有一个正在与他们作斗争的 linter

以上是关于Nestjs 日志响应数据对象的主要内容,如果未能解决你的问题,请参考以下文章

5.nestjs:整合日志(winsoton)

NestJS 不会在任何地方打印日志消息

使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?

NestJS:无法在 console.log 中获取嵌套对象。错误:类型 Dto 上不存在属性 x

PythonCrawl自学日志

在 Google Cloud Scheduler 日志中查看响应正文