2

我正在尝试使用“错误输入异常过滤器”来捕获错误并将它们返回给客户端。我在我的 monorepo 中同时拥有 websockets 和 http 端点,在一个应用程序上我同时拥有这两个端点。

我遇到的问题是,我不想为 WS 和 HTTP 使用两个单独的异常过滤器,直到现在我都依赖于 nestjs 定义请求或套接字上下文来利用它并将错误返回给websocket 或通过 http res.send 返回错误。

但事实证明,即使应用程序中根本没有 websocket,也没有注册适配器,什么都没有,它们都被定义了。

异常处理程序:

    const req: IRequest = host.switchToHttp().getRequest();
    const res: Response = host.switchToHttp().getResponse();

    const socket: ISocket = host.switchToWs().getClient();
  

    if (req && res) {
     // returning req res
    }

    if (socket) {
      // emitting error on socket

有没有办法:

  • 防止这种情况
  • 从上下文中挖掘另一个值以知道将错误返回到哪里

谢谢你。

4

1 回答 1

1

需要注意的是,它ExecutionContext有一个args属性,它是与请求相关的值数组。这些switchTo*().get*()方法实际上只是诸如getArgsByIndex(). 您可以做什么,而不是检查, 和is 的真实性,而是使用 / 上的req属性,该属性将返回, , , 或取决于请求,然后您可以从那里分离出错误处理逻辑。我喜欢使用 switch case,但是 if 语句也可以ressocketgetType()ArgumentHostExecutionContexthttpwsrpcgraphql

switch (host.getType<ContextType | 'graphql'>()) {
  case 'http':
    return this.handleHttpError(exception, host);
  case 'graphql':
    return this.handleGqlError(exception, host);
  case 'ws':
    return this.handleWsError(exception, host);
  case 'rpc':
    return this.handleRpcError(exception, host);
}

我在日志拦截器中有类似ExecutionContext的东西,使用而不是ArgumentHost,但想法应该是一样的。ExecutionContext 只有一个getClassandgetHandler方法

于 2021-04-14T16:17:59.277 回答