在跟随书上教程搭建socket.io的时候我遇到了以下问题:
io.sockets.on('connection',function(socket){
console.log('init');
socket.on('getAllMessages',function(){
socket.emit('allMessages',messages);
})
socket.on('createMessage',function(message){
messages.push(message);
io.sockets.emit('messageAdded',message);
})
})
io.set('authorization',function(handshakeData,accept){
handshakeData.cookie = Cookie.parse(handshakeData.headers.cookie);
var connectSid = handshakeData.cookie['connect.sid'];
if(connectSid){
connectSid = parseSignedCookie(connectSid,'technode');
sessionStore.get(connectSid,function(error,session){
if(error){
accept(error.message,false);
}else{
handshakeData.session = session;
if(session._userId){
accept(null,true);
}else{
accept('No login');
}
}
})
}else{
accept('No session');
}
})
这段代码中,如果我加入了io.set(‘authorization’,)的代码段,io.sockets.on(‘connection’)里面的代码就得不到执行。。请问是什么原因?
你的代码要求从客户端浏览器中发送connect.sid这个cookie 名称。你说无法执行io.sockets.on(‘connection’)这个,估计就是这个原因。你可以在客户端脚本中加入error事件, 应该很快就知道这个error事件中的参数的值是 No session 或 No login
@nodejser 是的,的确是No session。。只不过如果我把io.set('authorization’)内的代码全部注释掉,onconnection部分还是没法执行(console.log(‘init’);没有执行),而如果我把io.set('authorization’)整个方法注释掉就没问题,十分疑惑。。
你把io.set('authorization’)整个方法注释掉 的含义是指不启用认证。 你把io.set('authorization’)内的代码全部注释掉,这个是启用了认证,但没有明确表示认证通过,所以就无法连接了. 你可以加上io.set('authorization’)这个,然后这个事件中直接加上accept(null,true);应该就可以了。 另外,你使用的不是1.0以上的版本吧。。
@nodejser 的确可以了,谢谢指导,因为我刚开始接触Node有蛮多都不太明白的。。 用的是1.0+的版本。。
@SoAanyip 太客气。。。