TypeError:Object#<socket>没有方法&#39; set&#39; </socket>

时间:2014-12-04 08:21:53

标签: javascript node.js socket.io

您好我正在尝试使用socket.io制作协作画布,这是我的服务器端代码

var sanitizer = require('validator').sanitize;
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server),

chat = io.of('/chat'),
canvas = io.of('/canvas')
;

function sanitize(string) {
return sanitizer(string).entityDecode()
} 



app.get(/(^\/.*$)/, function(request, response) {
var fileName = request.params[0];
if (fileName == '/')
    fileName = '/index.html';
response.sendFile(__dirname + '/client' + fileName);
});

io.sockets.on('connection', function(socket) {
socket.on('setName', function (name) {
    name = sanitize(name);
    socket.set('name', name);
    socket.broadcast.emit('receive', {
        sender:'Server',
        message:name + ' has joined.'
    })
});

socket.on('send', function (message) {
    socket.get('name', function(error, name) {
        if (name)
            socket.broadcast.emit('receive', {
                sender:name,
                message:sanitize(message)
            })
    })
});

socket.on('draw', function (command) {
    io.sockets.emit('draw', command)
});

socket.on('updateCursor', function(position) {
    socket.get('name', function(error, name) {
        if (name)
            socket.broadcast.emit('updateCursor', {
                name:name,
                position:position
            });
    });
});

socket.on('disconnect', function() {
    socket.get('name', function(error, name) {
        if (name) {
            socket.broadcast.emit('receive', {
                sender:'Server',
                message:name + ' has left.'
            });
            socket.broadcast.emit('removeCursor', name);
        }
    })
});
});
server.listen(3000, function(){
console.log('listening on *:3000');
});

但是当我尝试在localhost:3000上运行它时,我的控制台日志说了这个

C:\h>node server.js
listening on *:3000

events.js:72
    throw er; // Unhandled 'error' event
          ^
TypeError: Object #<Socket> has no method 'set'
  at Socket.<anonymous> (C:\h\server.js:26:16)
  at Socket.emit (events.js:95:17)
  at Socket.onevent (C:\h\node_modules\socket.io\lib\socket.js:327:8)
  at Socket.onpacket (C:\h\node_modules\socket.io\lib\socket.js:287:12)
  at Client.ondecoded (C:\h\node_modules\socket.io\lib\client.js:193:14)
  at Decoder.Emitter.emit (C:\h\node_modules\socket.io\node_modules\socket.io-
parser\node_modules\component-emitter\index.js:134:20)
  at Decoder.add (C:\h\node_modules\socket.io\node_modules\socket.io-parser\in
dex.js:247:12)
  at Client.ondata (C:\h\node_modules\socket.io\lib\client.js:175:18)
  at Socket.emit (events.js:95:17)
  at Socket.onPacket (C:\h\node_modules\socket.io\node_modules\engine.io\lib\s
ocket.js:99:14)

我的程序终止了, 有人可以帮我这个吗?我的socket.io版本有什么问题?即时通讯使用socket.io版本1.2.1

谢谢〜

2 个答案:

答案 0 :(得分:1)

socket.set('name', name)

将失败,因为Socket#set方法不属于Socket.IO API。删除该行。

答案 1 :(得分:0)

您必须直接在套接字中设置name属性。

官方文档说:

  

旧的 io.set() io.get()方法已弃用,仅支持向后兼容。以下是旧授权示例到中间件样式的翻译。

migration guide点击。