javascript - Nestjs zaznamenať objekt dát odpovede


Chcem zaznamenávať prichádzajúce požiadavky a odchádzajúce odpovede v NestJs. Informácie som získal odtiaľto Logging request/response in Nest.js a z dokumentácie NestJs Aspect Interception.

Bolo by skvelé dosiahnuť to bez použitia externých balíčkov, takže by som veľmi preferoval natívne riešenie v "Nest".

Na protokolovanie požiadaviek momentálne používam tento kód

@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();
  }
}

Toto by zaznamenalo nasledujúci výsledok pre GET /users

Chcem tiež zaznamenať odchádzajúcu odpoveď. Momentálne používam tento interceptor

@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,
        }),
      ),
    );
  }
}

Toto by zaznamenalo nasledujúci výsledok pre GET /users

ale ako môžem získať prístup k údajom, ktoré boli odoslané späť klientovi?

Odpoveď č. 1

Najprv by som navrhol spojiť tieto do jedného loggera, len aby všetka logika logovania bola na jednom mieste.

Po druhé, aby ste získali dáta, ktoré sa posielajú späť klientovi, vo vašej funkcii tap musíte pridať parameter do funkcie, zvyčajne ho voláme data, aby ste vedeli, čo sa posiela späť. Toto je trochu zakryté Nestom, pretože nie je úplne jasné, na čom observable pracuje, ale nakoniec, niečo takéto pre vás funguje:

@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,
        })
      )
    );
  }
}

Toto bude fungovať aj v prípade, že sa rozhodnete rozdeliť to späť na dva samostatné interceptory, ale mať jeden môže tiež uľahčiť určenie času volania.

Súvisiace články