#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'
}
Примечание: Я смог увидеть сообщение журнала внутри промежуточного программного обеспечения, которое означает, что с промежуточным программным обеспечением проблем нет. Я также вижу, что работает только служба подписки.