MongoError的NestJS异常筛选器返回UnhandledPromiseRejectionWarning



我正试图通过Mongoose为Mongo错误创建一个自定义异常过滤器。当我使用过滤器时,会出现UnhandledPromiseRetentionWarning,并且不会给出任何结果。知道我该怎么解决吗?

错误:UnhandledPromiseRejectionWarning: TypeError: Right-hand side of 'instanceof' is not an object

users.controller.ts

import { Body, Controller, Post, UseFilters } from '@nestjs/common';
import { UsersService } from './users.service';
import { RegisterUserDto } from './dto/register-user.dto';
import { MongooseExceptionFilter } from './filters/mongoose-exception.filter';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@UseFilters(MongooseExceptionFilter)
@Post('register')
register(@Body() registerDto: RegisterUserDto) {
return this.usersService.create(registerDto);
}
}

猫鼬异常.filter.ts

import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Request, Response } from 'express';
import { MongoError } from 'mongoose';
@Catch(MongoError)
export class MongooseExceptionFilter implements ExceptionFilter {
catch(exception: MongoError, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
// const status = exception.getStatus();
console.log('Exception', exception);
response
.status(418)
.json({
statusCode: 418,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}

问题是"MongoError"不能直接在mongose包中使用,并且mongodb包中的MongoError与mongose使用的不同。解决方案非常简单,在mongoose-exception.filter.ts文件中,我将导入更改为:

import { MongoError } from 'mongoose/node_modules/mongodb';
import {
ArgumentsHost,
Catch,
ConflictException,
ExceptionFilter,
} from '@nestjs/common';
import { MongoServerError } from 'mongodb';
import * as mongoose from 'mongoose';

@Catch(mongoose.mongo.MongoServerError)
export class MongoExceptionFilter implements ExceptionFilter {
catch(exception: MongoServerError, host: ArgumentsHost) {
switch (exception.code) {
case 11000:
throw new ConflictException(
`Duplicate unique key '${Object.keys(exception.keyValue)}'`,
);
}
}
}

试着这样做。

import { Error } from 'mongoose';
@Catch(Error.ValidationError)
export class MongooseExceptionFilter implements ExceptionFilter {
catch(exception: Error.ValidationError, host: ArgumentsHost) {

}
}

最新更新