首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何组织在NestJ服务中抛出业务逻辑异常?

我如何组织在NestJ服务中抛出业务逻辑异常?
EN

Stack Overflow用户
提问于 2019-08-20 07:23:27
回答 2查看 9.3K关注 0票数 9

我对这个github问题的讨论有一些疑问:https://github.com/nestjs/nest/issues/310

我想像shekohex建议的那样,从服务的方法中抛出业务域异常。我想知道我该把它们藏在哪里?我相信他们中的许多人在不同的领域(如EntityNotFoundExceptionActionForbiddenException等)都会有相似之处。因此,将它们保持在应用程序级别(某种共享模块)是有意义的。另一方面,这会降低特定域的独立性(例如,如果在将来的某个时候我需要将其中的几个提取到另一个应用程序中呢?)更重要的是,有些异常可能是特定于域的,我必须将它们保存在适当的域模块的结构中。

让我们假设我确实将其中的一些保存在共享模块中,其余的保存在单独的域目录中。如何将它们映射到适当的HttpExceptions?如果我做了全局异常过滤器,我也会使我的域控制器更加依赖于应用层。如何映射特定域的异常?是否创建另一个模块级异常筛选器?

创建全局或模块级别的过滤器是一种方法吗?用UseFilters装饰每个端点似乎很麻烦。

预先感谢您的投入!

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-20 22:42:51

这是我最近一直在处理的一个好问题。

对于某些项目,我们希望在应用程序的不同域之间共享业务错误。我们最终的结果只是有一个共享(或公共)文件夹或模块,公开了我们在应用程序中遇到的不同领域特定的错误。

在此基础上,我们使用Nest中常见的例外,这对这项工作来说是很好的!

最后,我们使用共享域特定的业务错误自定义常见的Nest异常。

极简user.service.ts复制示例:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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
}

或者,有时如果您想要更通用的内容,也可以使用共享错误:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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装饰每个端点似乎很麻烦。

  • 我们可以利用嵌套过滤器定制,也可以在控制器或路由级别使用装饰器。但是对我来说,您实际上仍然需要指定与其相关的业务错误,这样您就可以为您的业务错误增加价值,并且无论如何都需要在您的服务中增加错误。因此,只包含一些包含特定域(或业务)错误的共享文件和更通用的错误是很好的,imo (但可能不是最干净/最优雅的解决方案)。
  • 您可以将您的业务错误文件放入每个模块的文件夹中,并添加一个webpack配置来收集所有这些文件并将它们连接到一个唯一的文件中。

最后,我想如果您需要跨多个项目的特定域错误或共享错误,甚至可以创建一个npm包。

让我知道,如果我不清楚,或/如果这给你更多的洞察力!

票数 12
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57568559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档