javascript - NestJS och TypeORM Undantagsfilter: Get Status är inte en funktion
Jag utvecklar en app med NestJS och TypeORM. Mitt mål är att fånga TypeORM-fel och det kan göras med hjälp av undantagsfilter.
Men mitt problem är att jag stöter på detta fel:
(node:345) UnhandledPromiseRejectionWarning: TypeError: exception.getStatus is not a functionDetta är liknande detta GitHub-inlägg som diskuterar problemet, men det fungerar inte för mig.
Här är min uppsättning:
@Catch(QueryFailedError)
export class TypeORMQueryExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus(); //error here
....
Jag har deklarerat detta globalt, så
main.ts
app.useGlobalFilters(new TypeORMQueryExceptionFilter())app.module.ts
....
providers: [
{
provide: APP_FILTER,
useClass: TypeORMQueryExceptionFilter
}
]
...
Om du har en idé om varför getStatus() av HttpException är odefinierad, skulle det vara en stor hjälp.
Uppdatering
Som denna rad antyder catch(exception: HttpException, host: ArgumentsHost) { i relation till @Catch(QueryFailedError), kan jag anta att HttpException är fel typ för parametern exception. Det borde vara, om någonsin, catch(exception: QueryFailedError, host: ArgumentsHost) { istället.
Således, eftersom QueryFailedError-datastrukturen är denna:
export declare class QueryFailedError extends TypeORMError {
readonly query: string;
readonly parameters: any[] | undefined;
readonly driverError: any;
constructor(query: string, parameters: any[] | undefined, driverError: any);
}
Jag tror att const status=exception.getStatus(); inte är nödvändigt så vi skulle kunna skriva om eller ta bort const status=exception.getStatus() till const status=exception.driverError(). Detta är relaterat till exemplet här.
Eftersom QueryFailedError inte representerar några http-felkoder i sina egenskaper, kan en lösning vara att hårdkoda http-statussvaret på detta sätt:
response
.status(500)
.json({
statusCode: 500,
timestamp: new Date().toISOString(),
path: request.url,
});
Kan någon validera detta eftersom det kan vara att jag bara gjorde något fel då exception: HttpException borde fungera ändå?
Svar #1
instanser av QueryFailedError har inte metoden getStatus. Åtgärda typerna på ditt filter:
@Catch(QueryFailedError)
export class TypeORMQueryExceptionFilter implements ExceptionFilter {
catch(exception: QueryFailedError, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
