Nestjs 即使异常来自http请求且存在';应用程序中没有套接字吗?

Nestjs 即使异常来自http请求且存在';应用程序中没有套接字吗?,nestjs,nestjs-gateways,nestjs-exception-filters,Nestjs,Nestjs Gateways,Nestjs Exception Filters,我试图使用“错误输入异常过滤器”捕获错误并将其返回给客户端。在我的monorepo中,我有WebSocket和http端点,在一个应用程序中,我有这两个端点 我现在遇到的问题是,我不想对WS&HTTP使用两个单独的异常过滤器,直到现在,我一直依赖于nestjs定义请求或套接字上下文来访问它,或者将错误返回到websocket,或者通过HTTP res.send返回错误 但事实证明,即使应用程序中根本没有WebSocket,没有注册适配器,什么都没有,它们都是定义的 异常处理程序: con

我试图使用“错误输入异常过滤器”捕获错误并将其返回给客户端。在我的monorepo中,我有WebSocket和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

有没有办法:

  • 防止这种情况
  • 点击上下文中的另一个值,了解将错误返回到何处

谢谢。

需要注意的是,
ExecutionContext
有一个
args
属性,它是一个与请求相关的值数组。
切换到*().get*()
方法实际上只是
getArgsByIndex()
之类的语法糖。您可以做的不是检查
req
res
socket
的真实性,而是使用
ArgumentHost
/
ExecutionContext
上的
getType()
属性,根据请求返回
http
ws
rpc
graphql
,然后您可以从中分离出错误处理逻辑。我喜欢使用switch case,但是if语句也可以

开关(host.getType()){
案例“http”:
返回此.handleHttpError(异常,主机);
案例“graphql”:
返回此.handleGqlError(异常,主机);
案例“ws”:
返回此.handleWsError(异常,主机);
案例“rpc”:
返回此.handleRpcError(异常,主机);
}
我在用于日志记录的拦截器中有类似的东西,使用
ExecutionContext
而不是
ArgumentHost
,但想法应该是相同的。ExecutionContext只有一个
getClass
getHandler
方法