Как исправить «Не удалось декодировать текстовый фрейм как UTF-8.» При отправке буфера RabbitMQ в Websocket? - PullRequest
0 голосов
/ 03 июня 2019

Весь обмен данными из очереди RabbitMQ с веб-сокетом завершается с ошибкой «Ошибка подключения WebSocket к 'wss: // мой экземпляр cloudamqp / ws /»: не удалось декодировать текстовый фрейм как UTF- 8" .

У меня есть интерфейс, который использует STOMP с веб-сокетами и RabbitMQ для отправки запросов в микросервис. Эта часть связи работает, но MS не может отправлять ответы обратно во внешний интерфейс. Все попытки приводят к приведенному выше сообщению об ошибке. Внешний интерфейс может получать ответы, если я пропускаю веб-сокет и читаю из очереди напрямую, но для этого мне нужно использовать STOMP / веб-сокеты.

Объявление интерфейсной веб-розетки:

var wss = new WebSocket("wss://*our cloud amqp instance*/ws/");
var client = Stomp.over(wss);

и далее вниз:

client.subscribe('/queue/frontendResponse', onMessage);

Серверная часть помещает ответ в очередь frontendResponse следующим образом:

channel.sendToQueue(queue, msgpack.encode(data), options);

«Данные» в приведенном выше примере - это строковый объект JSON.

Я не думаю, что проблема связана с STOMP, так как браузер вызывает строку «var wss = new WebSocket ...» по порядку номеров в сообщении об ошибке (например, «Connection.js: 14»). Я пробовал расширенную UTF-8 кодировку различных частей объекта данных и объекта Buffer, созданного вызовом msgpack.encode (), но я все еще получаю то же сообщение об ошибке. Функция amqplib sendToQueue () принимает только буфер в качестве второго аргумента, поэтому попытка явной отправки строки в кодировке UTF-8 также не работает. Я также попробовал несколько идей из StackOverflow и других сайтов, таких как экранирование управляющих символов или использование «encodeURIComponent ()». Я не могу избавиться от этого сообщения об ошибке, и я не могу попробовать. Любая помощь очень ценится; спасибо!

1 Ответ

0 голосов
/ 03 июня 2019

Хорошо, я ответил на свой вопрос. Я прочитал ответ на Невозможно декодировать текстовый фрейм как UTF-8. , который предполагает, что JSON.stringify достаточно для создания объекта, приемлемого для протокола Websocket. Затем я создал буфер из этого. Таким образом, внутренний код изменился на:

channel.sendToQueue(queue, Buffer.from(JSON.stringify(msgpack.encode(data))), options);

и передний конец получает объект, с которым он может работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...