TypeError: io.sockets.socket is not a function 解决方案
Posted 倾城一笑stu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeError: io.sockets.socket is not a function 解决方案相关的知识,希望对你有一定的参考价值。
近日使用socket.io开发即时聊天应用程序时遇到这么一个问题,就是使用io.sockets.socket(socketid).emit('String', data) 给
指定的客户端发送消息时,报了一个 TypeError: io.sockets.socket is not a function 的错误,找了很久的原因,原来是当
socket.io版本大于1.0.x时,我们应该使用 io.to(socketid).emit('String', data) 来替代。
扩展一下,这个socketid我们可以怎么获取呢?
假如我们的业务是客户端每个用户都有对应的用户名,都通过socket连接到服务器,我们已经知道socketid只能在服务器端获
取,那么直接通过socket.id来获取socketid是不行的,因为不同的用户socketid不一样。那怎样解决呢?方法很简单,解决方案如下:
首先当客户端通过socket连接到服务器时,可以emit它的用户名,即:
socket.emit('postUsername',
username: username
);
这里value的username是已经被赋值了的。
然后在服务器端通过一张hash表来存储socketid即可,key为用户名,value为对应的socketid,具体代码如下:
var fs=require('fs');
var io= require('socket.io').listen(3000);
io.sockets.on('connection',function(socket)
//保存用户的socketid到hash表
socket.on('postUsername',function(data)
saveUserinfoToJson(data.username,socket.id);
)
//监听用户发送消息
socket.on('postMessage',function(data)
var username=data.to; //发给谁
getSocketIdAndSendMessage(username,data); //私发给指定的这个用户
/* 坑:私发给指定用户,不能像下面这样写,因为fs的readFile的第三个参数是一个回调函数,不能通过return来获取SocketId。
// var socketid=getUserSocketId(data.to);
// io.to(socketid).emit('receiveMessage',data); //现在只能用这个了
*/
/*坑:私发的以下两个API都不行了
//io.sockets.connected[socketid].emit('receiveMessage',data); 这个也不行了
//io.sockets.socket(socketid).emit('receiveMessage',data); 这个不行了
*/
//群发用下面的api
//io.sockets.emit('receiveMessage',data);
);
)
/*建一张hash表,保存用户的socketid*/
function saveUserinfoToJson(username,id)
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data)
var data = JSON.parse(data);
data[username] =id;
fs.writeFile(__dirname + "/" + "users.json",JSON.stringify(data), function (err1)
if(err1) console.log(err1);
)
);
/*根据用户名获取用户的socketid并私发消息给用户*/
function getSocketIdAndSendMessage(username,message)
//错误的写法
// var socketid;
// fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data)
// var data = JSON.parse(data);
// socketid =data[username];
// );
// return socketid;
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data)
var data = JSON.parse(data);
var socketid =data[username];
io.to(socketid).emit('receiveMessage',message);
);
当然我们得在同级目录下建一个users.json文件,内容为空的json,即 。
关于这个项目,源码地址 :https://github.com/lensh/chat-websocket,目前项目还在开发中(后续更新)
以上是关于TypeError: io.sockets.socket is not a function 解决方案的主要内容,如果未能解决你的问题,请参考以下文章
反应本机获取多标记[未处理的承诺拒绝:TypeError:TypeError:未定义不是对象(评估'this.state.markers.map
Django TypeError - TypeError: issubclass() arg 1 必须是一个类
pyspark:TypeError:'float'对象不可迭代
Python 3.8 TypeError: can't concat str to bytes - TypeError: a bytes-like object is required, not 's