Node.js Nest Js:WebCoket反向代理
我创建了一个graphql订阅服务器,它在端口7777上运行,路径为HTTP和WebSocket协议的/subscriptions/graphql,当我将URL直接用于其他服务时,它绝对工作正常Node.js Nest Js:WebCoket反向代理,node.js,websocket,graphql,nestjs,Node.js,Websocket,Graphql,Nestjs,我创建了一个graphql订阅服务器,它在端口7777上运行,路径为HTTP和WebSocket协议的/subscriptions/graphql,当我将URL直接用于其他服务时,它绝对工作正常 HTTP : http://localhost:7777/subscriptions/graphql websocket: ws://localhost:7777/subscriptions/graphql 订阅服务器是一种微服务,就像我们拥有的其他服务一样。现在,我的目标是在网关中执行反向代理。我想
HTTP : http://localhost:7777/subscriptions/graphql
websocket: ws://localhost:7777/subscriptions/graphql
订阅服务器是一种微服务,就像我们拥有的其他服务一样。现在,我的目标是在网关中执行反向代理。我想为基于HTTP和WebSocket的连接做一个反向代理
为此,我编写了两个中间件,一个用于HTTP,另一个用于Websocket。基于Http的中间件工作正常。然而,WebSocket没有按预期工作
基于Websocket的中间件
import { NestMiddleware, Logger, Injectable } from '@nestjs/common';
import { createProxyMiddleware } from 'http-proxy-middleware';
@Injectable()
export class SubscriptionServiceWebSocketReverseProxyMiddleware
implements NestMiddleware {
/*
jscpd:ignore-start
*/
constructor(private readonly logger: Logger) { }
private proxy = createProxyMiddleware({
target: 'ws://localhost:7777/subscriptions/graphql',
secure: false,
changeOrigin: true,
ws: true,
onProxyReq: (proxyReq, req, res) => {
this.logger.debug(
`[SubscriptionServiceWebSocketReverseProxyMiddleware]: Proxying ${req.method} request originally made to '${req.originalUrl}'...`,
);
},
});
use(req: any, res: any, next: () => void) {
this.proxy(req, res, next);
}
/*
jscpd:ignore-end
*/
}
当websocket请求从UI发出时,我发现下面的错误
[Nest] 43743 - 08/24/2020, 3:20:20 PM [SubscriptionServiceWebSocketReverseProxyMiddleware]: Proxying GET request originally made to '/subscriptions/ws/graphql'...
[HPM] Upgrading to WebSocket
events.js:200
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:200:27)
Emitted 'error' event on Socket instance at:
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:81:21) {
errno: 'ECONNRESET',
code: 'ECONNRESET',
syscall: 'read'
}
注意:我能够看到中间件内部的日志消息,这意味着中间件没有问题。我还看到订阅服务本身也在发挥作用