我对这个github问题的讨论有一些疑问:https://github.com/nestjs/nest/issues/310
我想像shekohex建议的那样,从服务的方法中抛出业务域异常。我想知道我该把它们藏在哪里?我相信他们中的许多人在不同的领域(如EntityNotFoundException、ActionForbiddenException等)都会有相似之处。因此,将它们保持在应用程序级别(某种共享模块)是有意义的。另一方面,这会降低特定域的独立性(例如,如果在将来的某个时候我需要将其中的几个提取到另一个应用程序中呢?)更重要的是,有些异常可能是特定于域的,我必须将它们保存在适当的域模块的结构中。
让我们假设我确实将其中的一些保存在共享模块中,其余的保存在单独的域目录中。如何将它们映射到适当的HttpExceptions?如果我做了全局异常过滤器,我也会使我的域控制器更加依赖于应用层。如何映射特定域的异常?是否创建另一个模块级异常筛选器?
创建全局或模块级别的过滤器是一种方法吗?用UseFilters装饰每个端点似乎很麻烦。
预先感谢您的投入!
发布于 2019-08-20 22:42:51
这是我最近一直在处理的一个好问题。
对于某些项目,我们希望在应用程序的不同域之间共享业务错误。我们最终的结果只是有一个共享(或公共)文件夹或模块,公开了我们在应用程序中遇到的不同领域特定的错误。
在此基础上,我们使用Nest中常见的例外,这对这项工作来说是很好的!
最后,我们使用共享域特定的业务错误自定义常见的Nest异常。
极简user.service.ts复制示例:
import { NotFoundException, Logger } from '@nestjs/common';
import { UserBusinessErrors } from '../../shared/errors/user/user.business-errors';
// some code ...
// Find the users from the usersIds array
const dbUsers = await this.userRepository.find({ id: In(usersIds) });
// If none was found, raise an error
if (!dbUsers) {
Logger.error(`Could not find user with IDs: ${usersIds}`, '', 'UserService', true);
throw new NotFoundException(UserBusinessErrors.NotFound);
}在共享或公共模块/文件夹(例如,user.business-errors.ts )中包含相应的src/shared/errors/user/user.business-errors.ts文件:
export const UserBusinessErrors = {
// ... other errors
NotFound: {
apiErrorCode: 'E_0002_0002',
errorMessage: 'User not found',
reason: `Provided user ids doesn't exist in DB`
},
// ... other errors
}或者,有时如果您想要更通用的内容,也可以使用共享错误:
import { InternalServerErrorException, Logger } from '@nestjs/common';
import { SharedBusinessErrors } from '../../shared/errors/shared.business-errors';
// some code ...
try {
// ...
} catch (error) {
Logger.log(SharedBusinessErrors.DbSaveError, 'UserService');
throw new InternalServerErrorException(SharedBusinessErrors.DbSaveError, error.stack);
}与相应的shared.business-errors.ts文件:
export const SharedBusinessErrors = {
DbSaveError: {
apiErrorCode: 'E_0001_0001',
errorMessage: `Error when trying to save resource into the DB`,
reason: 'Internal server error'
},
// ... other errors
}最后的想法,评论你的不同问题:
创建全局或模块级别的过滤器是一种方法吗?用UseFilters装饰每个端点似乎很麻烦。
最后,我想如果您需要跨多个项目的特定域错误或共享错误,甚至可以创建一个npm包。
让我知道,如果我不清楚,或/如果这给你更多的洞察力!
发布于 2019-08-20 22:21:21
好的,让我们集中精力将异常保存在共享文件夹中,我们得到了您说的为HttpExceptions创建全局异常筛选器的方法,这是一种不错的方法,您可以在异常本身中格式化输出。其他方法可以是创建一个BusinessDomainFilter并只捕获与域相关的异常:
@Catch(EntityNotFoundException, ActionForbiddenException)
@Injectable()
export class BusinessDomainFilter implements ExceptionFilter {
...并且只映射那些异常,剩下的则留给应用程序筛选器。
https://stackoverflow.com/questions/57568559
复制相似问题