Nest Js: обратный прокси-сервер Webscoket

#node.js #websocket #graphql #nestjs

#node.js #websocket #graphql #nestjs

Вопрос:

Я создал сервер подписки graphql, который работает на порту 7777 с путем / subscriptions / graphql как для HTTP, так и для протокола WebSocket, который абсолютно нормально работает, когда я напрямую использую 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 выполняется из пользовательского интерфейса, я получаю сообщение об ошибке ниже

 [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'
}
  

Примечание: Я смог увидеть сообщение журнала внутри промежуточного программного обеспечения, которое означает, что с промежуточным программным обеспечением проблем нет. Я также вижу, что работает только служба подписки.