《Node.js实战》中socket.io聊天室的问题
发布于 10 年前 作者 SoAanyip 4360 次浏览 最后一次编辑是 8 年前 来自 问答

在跟随书上教程搭建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+的版本。。

回到顶部