TypeError: io.sockets.socket is not a function 解决方案
2017-05-11 00:57
483 查看
近日使用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它的用户名,即:
这里value的username是已经被赋值了的。
然后在服务器端通过一张hash表来存储socketid即可,key为用户名,value为对应的socketid,具体代码如下:
当然我们得在同级目录下建一个users.json文件,内容为空的json,即 {}。
关于这个项目,源码地址 :https://github.com/lensh/chat-websocket,目前项目还在开发中(后续更新)
指定的客户端发送消息时,报了一个 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,目前项目还在开发中(后续更新)
相关文章推荐
- Missing error handler on `socket`. TypeError: socket.set is not a function
- TypeError: $.cookie is not a function解决方案
- extjs之TypeError: d.read is not a function解决方案
- UnCaught TypeError:date.getFullYear is not a function解决方案
- 关于 "Uncaught TypeError: Property 'submit' of object #<HTMLFormElement> is not a function" 的解决方案
- Uncaught TypeError: xxx.submit is not a function解决方案
- 在用chrome调试JavaScript时,在console中出现“uncaught TypeError: Object is not a function”
- TypeError: jQuery(...).validationEngine is not a function
- “Uncaught TypeError: string is not a function”
- TypeError: record.get is not a function
- chrome浏览器Uncaught TypeError: object is not a function问题解决
- js Uncaught TypeError: undefined is not a function
- TypeError: e[h] is not a function
- Uncaught TypeError: string is not a function
- typeError: form.submit is not a function
- Backbone 或 jQuery 出错,异常:Uncaught TypeError: object is not a function
- chrome浏览器Uncaught TypeError: object is not a function问题解决
- 使用jquery插件autocomplete时候出现typeerror:this.source is not a function即与jquery的autocomplete冲突
- Google Chrome: Uncaught TypeError: String is not a function.
- Uncaught TypeError: object is not a function