nest js сохранять информацию о каждом запросе, не обращаясь к базе данных дважды - PullRequest
0 голосов
/ 02 августа 2020

Я хочу сохранить каждый запрос (путь, метод и userId), который поступает на сервер, без необходимости дважды обращаться к базе данных, а также без нарушения основного logi c в файлах служб с транзакциями.

Первоначально я пытался использовать перехватчик , потому что он вызывается после auth guards «который прикрепляет пользователя к запросу» и перед обработчиками запросов, но я столкнулся с двумя проблемами. во-первых, тот факт, что перехватчик вызовет базу данных для сохранения новой записи, а затем перенаправит запрос обработчикам, которые снова обратятся к БД для обработки запроса. Во-вторых, это не сработало из-за проблем с внедрением зависимостей.

приведенный ниже код не работает из-за ошибок зависимости, как я уже упоминал, но он даст вам представление о том, что мне нужно достичь.

import { Injectable,
  NestInterceptor,
  Inject,
  ExecutionContext,
  CallHandler,
  HttpException,
  HttpStatus } from '@nestjs/common';
import { Observable } from 'rxjs';
import { getRepositoryToken } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { HistoryEntity } from '../../modules/history/history.entity';

@Injectable()
export class HistoryInterceptor implements NestInterceptor {
  constructor(
    @Inject(getRepositoryToken(HistoryEntity))
    private readonly historyRepo: Repository<HistoryEntity>
  ) {}

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest();
    const { user, path, method } = request
    if (!user) {
      throw new HttpException('something terrible happened!', HttpStatus.BAD_GATEWAY);
    }

    const history = this.historyRepo.create({
      path,
      userId: user.id,
    });

    this.historyRepo.save(history);

    return next.handle();
  }
}

PS. с точки зрения производительности, также было бы здорово не останавливать выполнение запроса, чтобы сохранить эту информацию в базе данных, другими словами, можно ли НЕ использовать await в этой конкретной ситуации? потому что, по сути, это операция, связанная с системой, и поэтому Node [rocess не должен ждать, пока этот шаг обработает и вернет ответ клиенту.

Заранее спасибо.

...