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