【问题标题】:How to fix ''Could not decode a text frame as UTF-8." when sending RabbitMQ buffer to Websocket?将 RabbitMQ 缓冲区发送到 Websocket 时,如何修复“无法将文本帧解码为 UTF-8。”?
【发布时间】:2019-06-03 14:33:05
【问题描述】:

从 RabbitMQ 队列到 websocket 的所有通信都失败并出现错误,“WebSocket connection to 'wss://my cloudamqp instance/ws/' failed: could not decode a text frame as 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);

后端将响应放置到前端响应队列中,如下所示:

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()”。我无法摆脱此错误消息,并且无法尝试。非常感谢任何帮助;谢谢!

【问题讨论】:

  • 你如何在客户端解码msgpack
  • JSON.parse 消息体然后msgpack.decodedata 字段:var obj = JSON.parse(message.body); console.log(msgpack.decode(obj.data));
  • 抱歉,一直在尝试使格式正常工作。但我想你明白了。

标签: javascript websocket rabbitmq


【解决方案1】:

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

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

然后前端得到一个可以使用的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2021-12-21
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多