在使用NestJS创建API时,我想知道哪种方法是处理错误/异常的最佳方法.

  1. 让单独的服务和验证管道throw new Error(),让控制器catch安装它们,然后抛出相应类型的HttpException(BadRequestExceptionForbiddenException等)
  2. 让控制器简单地调用负责处理该部分业务逻辑的服务/验证管道方法,并抛出相应的HttpException.

这两种方法都有利弊:

  1. 这似乎是正确的方式,然而,服务可以返回Error个不同的原因,我如何从控制器知道,这将是相应的HttpException种返回?
  2. 非常灵活,但在服务中有Http个相关的东西似乎是错误的.

我想知道,哪一种(如果有的话)是"nest js"的方式?

你如何处理这件事?

推荐答案

假设您的业务逻辑抛出EntityNotFoundError,您希望将其映射到NotFoundException.

为此,您可以创建一个Interceptor,用于转换错误:

@Injectable()
export class NotFoundInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    // next.handle() is an Observable of the controller's result value
    return next.handle()
      .pipe(catchError(error => {
        if (error instanceof EntityNotFoundError) {
          throw new NotFoundException(error.message);
        } else {
          throw error;
        }
      }));
  }
}

然后,您可以通过向控制器的类或方法添加@UseInterceptors(NotFoundInterceptor)来使用它;甚至作为所有路由的全球拦截器.当然,您也可以在一个拦截器中映射多个错误.

试试这个codesandbox.

Node.js相关问答推荐

Express 4.18正文解析

聚合发布/订阅消息

如何在MEVN堆栈中结合创建和更新表单流程?

尽管 tsconfig 中提供了正确的路径,但仍出现找不到模块错误

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

我如何保护nodejs中的路由

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

使用 NPM 三个 mocha+typescript 进行测试

Express.js - 监听请求中止

在mongodb中只查询整数

为什么我在生产环境中 deproy Next.js 示例项目时 CSS 不起作用?

使用 WebSockets 有服务器成本吗?

使用restify时如何支持cors

安全沙箱并执行用户提交的 JavaScript?

在 Node.js 中的两个不同进程之间进行通信

在 Node.js 与 Cron 作业(job)中设置间隔?

React Native ios build:找不到 node

如何在不全局安装的情况下在 Node REPL 中要求 node 模块?

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?

npm install packagename --save-dev 不更新 package.json