Redis 错误:连接处于订阅服务器模式,只能使用订阅服务器命令

Redis 错误:连接处于订阅服务器模式,只能使用订阅服务器命令,redis,publish-subscribe,node-redis,Redis,Publish Subscribe,Node Redis,我发现在Redis中推送消息数据时出错。请给我一些关于错误的指导。为什么会这样?我想使用nodejs在redis中存储聊天数据 server.js(服务器): script.js(客户端): $(函数(){ 变量套接字=io.connect(“http://localhost:8080/"); /* * ------------------- *方法 * ------------------- */ $.fn.clearAndFocus=函数(){ $(“#txtMessage”).val(“”

我发现在Redis中推送消息数据时出错。请给我一些关于错误的指导。为什么会这样?我想使用nodejs在redis中存储聊天数据

server.js(服务器):

script.js(客户端):

$(函数(){
变量套接字=io.connect(“http://localhost:8080/");
/*
* -------------------
*方法
* -------------------
*/
$.fn.clearAndFocus=函数(){
$(“#txtMessage”).val(“”.focus();
};
$.fn.sendMessageToServer=函数(){
emit(“chat”,{msg:$(“#txtMessage”).val()});
$.fn.clearAndFocus();
};
$.fn.clearAndFocus();
/*
* -------------------
*事件
* -------------------
*/
$(“#btnSend”)。在(“单击”上,函数(){
$.fn.sendMessageToServer();
});
$(“#txtMessage”)。在(“键控”,函数(e){
如果(如keyCode===13){
$.fn.sendMessageToServer();
$.fn.clearAndFocus();
}
});
/*
* -------------------
*套接字事件
* -------------------
*/
socket.on('connect',function(){
日志(“w客户端已连接”);
});
socket.on(“publishMessage”,函数(数据){
console.log(data.msg);
$(“.chatlog”).append(“\n\
\n\
“+data.msg+”\n\
");
});
socket.on('disconnect',function(){
});
});
console.log:

root@wk11:/var/www/html/wchat/nodejs# nodejs server.js
Option log level is not valid. Please refer to the README.
Server up and running...
redis connection message:{"msg":"56151810ceff6 is connecting..."}
app port :: 8080
chat emtis
Missing error handler on `socket`.
Error: Connection in subscriber mode, only subscriber commands may be used
    at RedisClient.send_command (/var/www/html/wchat/nodejs/node_modules/redis/index.js:751:15)
    at RedisClient.(anonymous function) (/var/www/html/wchat/nodejs/node_modules/redis/index.js:891:21)
    at pushToRedis (/var/www/html/wchat/nodejs/server.js:71:16)
    at Socket.<anonymous> (/var/www/html/wchat/nodejs/server.js:99:9)
    at Socket.emit (events.js:95:17)
    at Socket.onevent (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/socket.js:330:8)
    at Socket.onpacket (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/socket.js:290:12)
    at Client.ondecoded (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/client.js:193:14)
    at Decoder.Emitter.emit (/var/www/html/wchat/nodejs/node_modules/component-emitter/index.js:134:20)
    at Decoder.add (/var/www/html/wchat/nodejs/node_modules/socket.io-parser/index.js:247:12)
root@wk11:/var/www/html/wchat/nodejs#nodejs server.js
选项日志级别无效。请参阅自述。
服务器已启动并正在运行。。。
redis连接消息:{“msg”:“56151810ceff6正在连接…”
应用端口::8080
聊天室
“套接字”上缺少错误处理程序。
错误:连接处于订阅服务器模式,只能使用订阅服务器命令
在RedisClient.send_命令(/var/www/html/wchat/nodejs/node_modules/redis/index.js:751:15)
在RedisClient(匿名函数)(/var/www/html/wchat/nodejs/node_modules/redis/index.js:891:21)
在pushToRedis(/var/www/html/wchat/nodejs/server.js:71:16)
在插座上。(/var/www/html/wchat/nodejs/server.js:99:9)
在Socket.emit(events.js:95:17)
位于Socket.onevent(/var/www/html/wchat/nodejs/node_modules/Socket.io/lib/Socket.js:330:8)
位于Socket.onpacket(/var/www/html/wchat/nodejs/node_modules/Socket.io/lib/Socket.js:290:12)
在Client.ondecodded(/var/www/html/wchat/nodejs/node_modules/socket.io/lib/Client.js:193:14)
位于Decoder.Emitter.emit(/var/www/html/wchat/nodejs/node_modules/component Emitter/index.js:134:20)
在Decoder.add(/var/www/html/wchat/nodejs/node_modules/socket.io parser/index.js:247:12)

我已经在socket.io中创建了订户的新子对象,它将解决我的问题,如下所述。因为订阅服务器的父对象在io.sockets.on()中不可访问,而且我已经为订阅服务器创建了另一个子对象

/*
 *  Sender
 */
var publisher = redis.createClient();
/*
 * Receiver
 */
var subscriber = redis.createClient();

/* 
 * -------------------
 * Socket
 * -------------------
 */
io.sockets.on('connection', function (socket) {
    var _subscriber = redis.createClient();
    //console.log("app port :: " + app.get("port"));    
    console.log("Session: %j", sessionHandler);
    //console.log(JSON.stringify(sessionHandler, null, 4));
    socket.on('connection', function (data) {
        console.log('Server running on *:' + app.get('port'));
    });
    socket.on('disconnect', function () {
    });
});

根据Redis文档:

一旦客户端进入订阅状态,它就不应该发出任何其他命令,除了其他SUBSCRIBE、PSUSCRIBE、UNSUBSCRIBE和PUNSCRIBE命令

链接:

为了发送lpush命令,您需要创建另一个未处于订阅状态的redis客户端

root@wk11:/var/www/html/wchat/nodejs# nodejs server.js
Option log level is not valid. Please refer to the README.
Server up and running...
redis connection message:{"msg":"56151810ceff6 is connecting..."}
app port :: 8080
chat emtis
Missing error handler on `socket`.
Error: Connection in subscriber mode, only subscriber commands may be used
    at RedisClient.send_command (/var/www/html/wchat/nodejs/node_modules/redis/index.js:751:15)
    at RedisClient.(anonymous function) (/var/www/html/wchat/nodejs/node_modules/redis/index.js:891:21)
    at pushToRedis (/var/www/html/wchat/nodejs/server.js:71:16)
    at Socket.<anonymous> (/var/www/html/wchat/nodejs/server.js:99:9)
    at Socket.emit (events.js:95:17)
    at Socket.onevent (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/socket.js:330:8)
    at Socket.onpacket (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/socket.js:290:12)
    at Client.ondecoded (/var/www/html/wchat/nodejs/node_modules/socket.io/lib/client.js:193:14)
    at Decoder.Emitter.emit (/var/www/html/wchat/nodejs/node_modules/component-emitter/index.js:134:20)
    at Decoder.add (/var/www/html/wchat/nodejs/node_modules/socket.io-parser/index.js:247:12)
/*
 *  Sender
 */
var publisher = redis.createClient();
/*
 * Receiver
 */
var subscriber = redis.createClient();

/* 
 * -------------------
 * Socket
 * -------------------
 */
io.sockets.on('connection', function (socket) {
    var _subscriber = redis.createClient();
    //console.log("app port :: " + app.get("port"));    
    console.log("Session: %j", sessionHandler);
    //console.log(JSON.stringify(sessionHandler, null, 4));
    socket.on('connection', function (data) {
        console.log('Server running on *:' + app.get('port'));
    });
    socket.on('disconnect', function () {
    });
});