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.*.*