socket.io-redis 尾随字节

Posted

技术标签:

【中文标题】socket.io-redis 尾随字节【英文标题】:socket.io-redis trailing bytes 【发布时间】:2014-09-03 11:57:51 【问题描述】:

我正在使用 socket.io-emitter 将事件广播到带有 for 循环的一组频道:

在文件中,我有:

var io = require('socket.io-emitter')(
  host: 'localhost',
  port: 6379
);

module.exports = 
  exampleFunction: function(req, res, next) 
    var channels = req.param('channels'),
        data = req.param('data');

    for (var i=0; i<channels.length; i++) 
      io.to(channels[i]).emit('example event', data)
    
  

app.js,我有socket.io-redis

io.adapter(socketio_redis( 
  host: 'localhost', 
  port: 6379,
  pubClient: redis.createClient(6379, '127.0.0.1'),
  subClient: redis.createClient(6379, '127.0.0.1')
))

当我尝试运行 exampleFunction 时,我在控制台中收到以下未捕获的错误:

Error: 348 trailing bytes
    at Object.decode (C:\Users\Website\socket.io-redis\node_modules\msgpack-js\msgpack.js:200:47)
    at Redis.onmessage (C:\Users\Website\socket.io-redis\index.js:93:24)
    at RedisClient.EventEmitter.emit (events.js:106:17)
    at RedisClient.return_reply (C:\Users\Website\node_modules\redis\index.js:672:22)
    at ReplyParser.<anonymous> (C:\Users\Website\node_modules\redis\index.js:309:14)
    at ReplyParser.EventEmitter.emit (events.js:95:17)
    at ReplyParser.send_reply (C:\Users\Website\node_modules\redis\lib\parser\javascript.js:300:10)
    at ReplyParser.execute (C:\Users\Website\node_modules\redis\lib\parser\javascript.js:211:22)
    at RedisClient.on_data (C:\Users\Website\node_modules\redis\index.js:534:27)
    at Socket.<anonymous> (C:\Website\node_modules\redis\index.js:91:14)

我看到这是来自 msgpack。你们有没有人遇到过这个错误?你是怎么解决的?

谢谢。

【问题讨论】:

代码中没有第348行。当我将不同的数据传递给发射函数时,348 个尾随字节会发生变化。例如,io.to(channels[i]).emit('example event', 'hello') 会导致错误更像是 '95 trailing bytes' 【参考方案1】:

nm.socket.io-redis的主页上写着:

Msgpack 给我们一个名为“尾随字节”的错误。看完之后 我们意识到我们可以只使用 JSON.stringfy/JSON.parse 代替 的 msgpack。

这看起来像您遇到的错误。按照那里的建议,试试JSON.strigfy

【讨论】:

如果我只使用 JSON.stringify,我会得到相同的错误,但尾随字节更少。 nm.socket.io-redis 包给出了一堆额外的错误。【参考方案2】:

好的, 我们找到了解决方案。参考: https://github.com/Automattic/socket.io-redis/issues/17

如您所见,socket.io-emitter 要求您在 redis 客户端上将 return_buffers 设置为 true。

让我知道这是否有效。否则我可以在代码中添加更多内容。

【讨论】:

能否请您返回解决方案差异的缓冲区? Redis 感谢您的发射器。【参考方案3】:

这应该可以回答您的问题。 https://github.com/Automattic/socket.io-redis/issues/17

【讨论】:

【参考方案4】:

这帮助我解决了Error: -560815898 trailing bytes 错误:

    npm install msgpack-js-v5

    在最顶部更改文件node_modules/socket.io-redis/index.js

    var msgpack = require('msgpack-js');

    var msgpack = require('msgpack-js-v5');

    现在使用类似这样的代码:

    var adapter = require('socket.io-redis');
    var pub = redis.createClient(6379, 'localhost');
    var sub = redis.createClient(6379, 'localhost',  return_buffers: true );
    io.adapter(adapter(pubClient: pub, subClient: sub));
    

更新:

在某些日子里,我偶然发现了一个错误 bops.readUInt64BE is not a function,所以最终我将 msgpack-js-v5 切换到 msgpack5,现在它可以正常工作了。

【讨论】:

以上是关于socket.io-redis 尾随字节的主要内容,如果未能解决你的问题,请参考以下文章

将 pm2 的集群模块与 socket.io 和 socket.io-redis 一起使用

如何从 socket.io-redis 发送私人消息(发射)

使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos

在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*

将 NSString 转换为 NSData 是不是会强制使用尾随字节?

从 C# 中的字节数组中删除尾随空值