类型错误:对象 #<套接字> 没有方法“设置”

TypeError: Object #<Socket> has no method 'set'

本文关键字:有方法 设置 套接字 对象 错误 类型      更新时间:2023-09-26

嗨,我正在尝试与 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');
});

但是当我尝试在本地主机: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 版本有什么问题吗?IM 使用 socket.io 版本 1.2.1

谢谢~

socket.set('name', name)

将失败Socket#set因为该方法不是 Socket.IO API 的一部分。删除该行。

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

官方文档 说:

旧的 io.set() 和 io.get() 方法已被弃用,仅支持向后兼容。下面是一个旧授权示例到中间件风格的翻译。

在迁移指南中战利品。