Node.js Nest Js:WebCoket反向代理

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 订阅服务器是一种微服务,就像我们拥有的其他服务一样。现在,我的目标是在网关中执行反向代理。我想

我创建了一个graphql订阅服务器,它在端口7777上运行,路径为HTTP和WebSocket协议的/subscriptions/graphql,当我将URL直接用于其他服务时,它绝对工作正常

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'
}
注意:我能够看到中间件内部的日志消息,这意味着中间件没有问题。我还看到订阅服务本身也在发挥作用