Socket.IO – Redis:SUBSCRIBE无法处理。 连接已经closures

我有一个简单的Redis - Socket.IO聊天应用程序,当用户点击F5或尝试刷新页面时会引发以下(redis)exception:

SUBSCRIBE无法处理。 连接已经closures。

当用户刷新页面,套接字重新连接,并且我的子RedisClient对象抛出这个exception。 这个事件反过来导致我的server.js也崩溃了。 当注释掉io.sockets.on连接中的所有子对象和pub对象时,套接字将重新连接而不会有任何exception,并且server.js将继续运行。

我的server.js

 var socket = require('socket.io'); var express = require('express'); var http = require('http'); var redis = require('redis'); var app = express(); var server = http.createServer(app); var io = socket.listen(server); var pub = redis.createClient(); var sub = redis.createClient(); app.use(express.static(__dirname)); io.sockets.on('connection', function (client) { sub.subscribe("chatbox"); sub.on("message", function (channel, message) { console.log("Message received, publishing..."); client.send(message); }); client.on("message", function (msg) { console.log(msg); pub.publish("chatbox", msg.message); }); client.on('disconnect', function () { sub.quit(); pub.publish("chatbox", "User: " + client.id + " is disconnected"); }); client.on("error", function (err) { console.log("Error " + err); }); }); server.listen(8888); 

(简体)html部分:

 $(document).ready(function() { var username ='Someone'; var socket = new io.connect('http://localhost:8888'); var msg = {type:'setUsername',user:username}; socket.json.send(msg); socket.on('connect', function() { console.log("Connected: " + Date()); }); $(window).on('beforeunload', function(){ socket.close(); }) //... 

node.js堆栈跟踪:

 AbortError at handle_offline_command (c:\xampp\htdocs\chatbox\node_modules\redis\index.js:839:15) at RedisClient.internal_send_command (c:\xampp\htdocs\chatbox\node_modules\redis\index.js:873:9) at RedisClient.subscribe (c:\xampp\htdocs\chatbox\node_modules\redis\lib\individualCommands.js:419:17) at Namespace.<anonymous> (c:\xampp\htdocs\chatbox\nodeServer4.js:17:6) at emitOne (events.js:96:13) at Namespace.emit (events.js:188:7) at Namespace.emit (c:\xampp\htdocs\chatbox\node_modules\socket.io\lib\namespace.js:209:10) at c:\xampp\htdocs\chatbox\node_modules\socket.io\lib\namespace.js:177:14 at _combinedTickCallback (internal/process/next_tick.js:67:7) at process._tickCallback (internal/process/next_tick.js:98:9) 

似乎RedisClient对象不能处理这些套接字断开连接。 添加围绕任何sub,pub对象的try catch(例如ie try { sub.subscribe("chatbox"); } catch { } )也没有帮助。

编辑:

添加以下几行使server.js保持活动状态,但是exception仍然被抛出,无法订阅,因此不能发布:

 sub.on("error", function (err) { console.log("Error " + err); }); pub.on("error", function (err) { console.log("Error " + err); }); Error AbortError: SUBSCRIBE can't be processed. The connection is already closed. 

sub.subscribe(“chatbox”)应该超出io连接的范围。 只有一个订阅是必需的。

 var pub = redis.createClient(); var sub = redis.createClient(); sub.subscribe("chatbox"); app.use(express.static(__dirname)); io.sockets.on('connection', function (client) { sub.on("message", function (channel, message) { ...