如何修复 无法将文本框架解码为 UTF-8." 时将 RabbitMQ 缓冲区发送到 Websocket?



从RabbitMQ 队列到 websocket 的所有通信都失败,并显示错误"WebSocket 连接到'wss://my cloudamqp instance/ws/' 失败:无法将文本框架解码为 UTF-8"。

我有一个前端,它使用带有websockets和RabbitMQ的STOMP向微服务发送请求。 通信的这一部分正在工作,但 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);

后端将响应放入前端响应队列,如下所示:

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

上面示例中的"数据"是一个字符串化的 JSON 对象。

我不认为问题出在 STOMP 上,因为浏览器会调用"var wss = new WebSocket..."错误消息中的逐行编号(例如,"连接.js:14")。 我已经尝试对数据对象和由 msgpack.encode() 调用创建的缓冲区对象的各个部分进行显式 UTF-8 编码,但我仍然收到相同的错误消息。 amqplib 函数 sendToQueue() 只接受缓冲区作为第二个参数,因此尝试显式发送 UTF-8 编码字符串也不起作用。 我还尝试了来自StackOverflow和其他网站的一些想法,比如转义控制字符或使用"encodeURIComponent()"。 我无法摆脱此错误消息,并且没有办法尝试。 任何帮助都非常感谢;谢谢!

好的,我回答了我自己的问题。 我在无法将文本框架解码为 UTF-8 上阅读了回复。建议的JSON.stringify足以创建一个Websocket协议可接受的对象。 然后我从中创建了一个缓冲区。 因此,后端代码更改为:

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

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

最新更新