将RabbitMQ缓冲区发送到Websocket时,如何解决“无法将文本帧解码为UTF-8”的问题?

时间:2019-06-03 14:33:05

标签: javascript websocket rabbitmq

从RabbitMQ队列到WebSocket的所有通信均失败,并显示以下错误:“与'wss:// my cloudamqp实例 / ws /的WebSocket连接失败:无法将文本框架解码为UTF -8“。

我有一个前端,该前端将STOMP与websockets和RabbitMQ一起使用,以将请求发送到微服务。通信的那部分正在工作,但是MS无法将响应发送回前端。所有尝试都会导致上述错误消息。如果我跳过websocket并直接从队列中读取,则前端能够获得响应,但是我必须为此使用STOMP / websockets。

前端websocket声明:

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”)。我已经尝试过显式地对由msgpack.encode()调用创建的数据对象和Buffer对象的各个部分进行UTF-8编码,但是仍然收到相同的错误消息。 amqplib函数sendToQueue()仅接受缓冲区作为第二个参数,因此尝试显式发送UTF-8编码的字符串也不起作用。我还尝试了StackOverflow和其他站点的许多想法,例如转义控制字符或使用“ encodeURIComponent()”。我无法摆脱此错误消息,无法尝试。任何帮助都是极大的感谢;谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我回答了我自己的问题。我在Could not decode a text frame as UTF-8.读到一个回复​​,该回复建议JSON.stringify足以创建Websocket协议可接受的对象。然后我从中创建了一个缓冲区。因此,后端代码更改为:

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

并且前端获得一个可以使用的对象。