《Node.js实战》中socket.io聊天室的问题
发布于 2个月前 作者 SoAanyip 289 次浏览 来自 问答

在跟随书上教程搭建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’)里面的代码就得不到执行。。请问是什么原因?

5 回复

你的代码要求从客户端浏览器中发送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+的版本。。

回到顶部