#typescript #nestjs
Вопрос:
Я пытаюсь настроить глобальный перехватчик, чтобы преобразовать внутренние ошибки в ошибки http. Похоже, он ничего не делает, я даже не могу получить консоль.войдите, чтобы показать. Я ни за что на свете не могу понять, что я делаю не так. Вот соответствующий код
main.ts
import { Logger, ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { TransformInterceptor } from './transform.interceptor';
import { createData } from '../seeds/index';
import morganMiddleware from './middleware/morgan-middleware';
import { ErrorsInterceptor } from './middleware/error-handling/error-interceptor';
declare const module: any;
async function bootstrap() {
const logger = new Logger();
const app = await NestFactory.create(AppModule, {
cors: true,
logger: true,
});
app.useGlobalPipes(new ValidationPipe());
app.useGlobalInterceptors(
new TransformInterceptor(),
new ErrorsInterceptor(),
);
app.use(morganMiddleware);
const port = 3000;
await app.listen(port);
logger.log(`Application listening on Port ${port}`);
}
bootstrap();
перехватчик ошибок.ts
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
HttpException,
} from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { mapToHttpError } from './error-maps';
@Injectable()
export class ErrorsInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
catchError((err) => {
if (err instanceof HttpException) return throwError(err);
const error = mapToHttpError(err);
return throwError(new error());
}),
);
}
}
карты ошибок.ts
import { UnauthorizedException } from '@nestjs/common';
import { TokenExpiredError } from 'jsonwebtoken';
export const mapToHttpError = (error) => {
if (error instanceof TokenExpiredError) {
return UnauthorizedException;
}
return error;
};
Любая помощь была бы очень признательна. Спасибо
ИЗМЕНИТЬ: Я могу подтвердить, что перехватчик работает на уровне контроллера
Комментарии:
1. Можете ли вы показать код TransformInterceptor, так как он выполняется до ErrorsInterceptor?
2. вы зарегистрировали его в модуле приложения
3. @Yilmaz В этом и была проблема. Большое спасибо, я не знаю, как я это пропустил.