Я хочу сохранить каждый запрос (путь, метод и 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 не должен ждать, пока этот шаг обработает и вернет ответ клиенту.
Заранее спасибо.