javascript - HATA [ExceptionHandler] Tanımsızın 'switchToHttp' özelliği okunamıyor TypeError: Tanımsızın 'switchToHttp' özelliği okunamıyor
Ne yapmaya çalışıyorum?
TypeOrm'dan gelen sorguları kaydetmek için bir günlükleyici (logger) uygulamaya çalışıyorum ve ayrıca kullanıcıyı tanımlamak için günlük bilgilere bazı bilgiler eklemeye çalışıyorum
Bunu nasıl başarmaya çalışıyorum?
TypeOrm'dan Logger arayüzünü uyguladım ve loglama için Winston kullandım. Kullanıcıyı tanımlamak için, sorguyu çalıştıran özel isteğin JWT tokenını çıkarmak istiyorum; bu token üzerinden user.id anahtarına sahip olacağım.
JWT'yi almak için NestJs tarafından sağlanan ExecutionContext sınıfını kullanarak istek gövdesini alıyor ve ardından JWT tokenını çıkarıyorum.
Hangi sorunla karşılaşıyorum?
Aşağıda uygulamayı verdim ve bununla ilgili hatayı paylaştım, yürütme bağlamının (execution context) tanımsız olduğunu görebiliyorum ve bu değeri nasıl ileteceğimden emin değilim, nest konusunda yeniyim ve yanlış bilmiyorsam, nest ExecutionContext sınıfının atanmasını kendisi hallediyor.
Ayrıca, bunu farklı bir şekilde uygulamak için önerilere açığım.
Hata:
[Nest] 11968 - ERROR [TypeOrmModule] Unable to connect to the database. Retrying (9)...
TypeError: Cannot read property 'switchToHttp' of undefined
Uygulama:
/* eslint-disable prettier/prettier */
import { ExecutionContext } from '@nestjs/common';
import { Logger, QueryRunner } from 'typeorm';
import { createLogger, Logger as winstonLogger, transports, format } from 'winston';
import { Format } from 'LogForm';
import { Request } from 'express';
export class CustomLogger implements Logger {
private readonly queryLogger: winstonLogger;
private readonly winstonFormat: Format;
private readonly ctt: ExecutionContext;
healthcheck2(ctx: ExecutionContext): any {
const payload = ctx.switchToHttp().getRequest<Request>();
console.log(payload);
}
constructor(){
this.winstonFormat= format.printf(({message})=> {
return `${message}`
});
const options = (filename: string) => ({
transports: [new transports.Console({level:'debug'})],
format: this.winstonFormat
});
this.queryLogger = createLogger(options('query.log'))
}
logQuery(query: string, _parameters?: any[], _queryRunner?: QueryRunner) {
this.healthcheck2(this.ctt);
this.queryLogger.log({
level: 'debug',
message: 'query logged',
timestamp: Date.now(),
label: 'query'
})
}
logQueryError(error: string | Error, query: string, parameters?: any[], queryRunner?: QueryRunner) {
console.log('query error');
}
logQuerySlow(time: number, query: string, parameters?: any[], queryRunner?: QueryRunner) {
console.log('other error');
}
logSchemaBuild(message: string, queryRunner?: QueryRunner) {
console.log('schema build');
}
logMigration(message: string, queryRunner?: QueryRunner) {
console.log('other error');
}
log(level: 'log' | 'info' | 'warn', message: any, queryRunner?: QueryRunner) {
console.log('normal log')
}
}