Регистрация запроса / ответа в Nest.js - PullRequest
1 голос
/ 11 марта 2019

Впервые в Nest.js,
Я пытаюсь реализовать простой регистратор для отслеживания HTTP-запросов, например:

:method :url :status :res[content-length] - :response-time ms

Насколько я понимаю, лучшим местом для этого будут перехватчики .Но я также использую Охранники и, как уже упоминалось, Охранники срабатывают после промежуточного программного обеспечения, но до перехватчиков.

То есть мои запрещенные доступы не регистрируются,Я мог бы написать часть регистрации в двух разных местах, но лучше нет.Есть идеи?

Спасибо!

Мой код перехватчика:

import { Injectable, NestInterceptor, ExecutionContext, HttpException, HttpStatus } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';

@Injectable()
export class HTTPLoggingInterceptor implements NestInterceptor {

  intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> {
    const now = Date.now();
    const request = context.switchToHttp().getRequest();

    const method = request.method;
    const url = request.originalUrl;

    return call$.pipe(
      tap(() => {
        const response = context.switchToHttp().getResponse();
        const delay = Date.now() - now;
        console.log(`${response.statusCode} | [${method}] ${url} - ${delay}ms`);
      }),
      catchError((error) => {
        const response = context.switchToHttp().getResponse();
        const delay = Date.now() - now;
        console.error(`${response.statusCode} | [${method}] ${url} - ${delay}ms`);
        return throwError(error);
      }),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

В итоге я внедрил классический логгер в необработанное приложение. Это решение не является лучшим, поскольку оно не интегрировано с потоком Nest, но хорошо работает для стандартных нужд журналирования.

import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { ApplicationModule } from './app.module';
import * as morgan from 'morgan';

async function bootstrap() {
    const app = await NestFactory.create<NestFastifyApplication>(ApplicationModule, new FastifyAdapter());
    app.use(morgan('tiny'));

    await app.listen(process.env.PORT, '0.0.0.0');
}

if (isNaN(parseInt(process.env.PORT))) {
    console.error('No port provided. ?');
    process.exit(666);
}

bootstrap().then(() => console.log('Service listening ?: ', process.env.PORT));
0 голосов
/ 23 марта 2019

У меня была похожая проблема с регистрацией правильного кода состояния из-за фильтров, запускаемых после перехватчика.Единственное решение, к которому я мог прийти, которое мне было удобно, это реализовать регистрацию в перехватчике.Очень похоже на то, как вы сделали это в своем коде.В то время как фильтр запускается после запуска перехватчика, наблюдаемое может быть использовано для выполнения функции после успешного завершения или ошибок.

Уловка для меня заключалась в том, что код состояния в ответе не гарантированно будет установлен правильно даже воператоры tap или catchError .Я решил эту проблему, проверив метод запроса, и если это метод POST, то я знаю, что успешный ответ - 201, иначе - всегда 200.
Если я получаю ошибку, я получаю код состояния из ошибки и используючто вместо кода состояния на объекте ответа.Поскольку мой фильтр исключений будет запущен до того, как наблюдаемое завершится, я знаю, что в этот момент на моем объекте ошибки будет существовать statusCode.

...