Node.js 如何修复&x2018;无法读取属性';发射';未定义的’;NodeJS中的错误

Node.js 如何修复&x2018;无法读取属性';发射';未定义的’;NodeJS中的错误,node.js,class,ecmascript-6,socket.io,Node.js,Class,Ecmascript 6,Socket.io,我正在创建一个类来处理socket.io中的事件,在这个类中我不能调用this.io.emit -- Socket file class Socket { constructor(io) { this.io = io; } run() { this.io.on('connection', function(socket) { console.log('new client has connect', socket.i

我正在创建一个类来处理socket.io中的事件,在这个类中我不能调用this.io.emit

-- Socket file
class Socket {
    constructor(io) {
        this.io = io;
    }
    run() {
        this.io.on('connection', function(socket) {
            console.log('new client has connect', socket.id);
            this.io.emit('new-client', socket.id);
        });
    }
}
module.exports = Socket;



typeError: Cannot read property 'emit' of undefined
    at Namespace.<anonymous> (C:\Users\truon\OneDrive\Desktop\ProjectNodeJS\socket.js:8:12)
    at Namespace.emit (events.js:189:13)
    at Namespace.emit C:\Users\truon\OneDrive\Desktop\ProjectNodeJS\node_modules\socket.io\lib\namespace.js:181:14
    at process._tickCallback (internal/process/next_tick.js:61:11)
--套接字文件
类套接字{
构造函数(io){
this.io=io;
}
运行(){
this.io.on('connection',函数(socket){
log('新客户端已连接',socket.id);
this.io.emit('new-client',socket.id);
});
}
}
module.exports=插座;
typeError:无法读取未定义的属性“emit”
在命名空间处。(C:\Users\truon\OneDrive\Desktop\ProjectNodeJS\socket.js:8:12)
位于Namespace.emit(events.js:189:13)
位于Namespace.emit C:\Users\trion\OneDrive\Desktop\ProjectNodeJS\node\u modules\socket.io\lib\Namespace.js:181:14
在进程中。_tick回调(内部/process/next_tick.js:61:11)

在回调函数中,
不等于
套接字
实例

您需要使用
.bind
或使用箭头函数

class Socket {
    constructor(io) {
        this.io = io;
    }
    run() {
        this.io.on('connection', socket => {
            console.log('new client has connect', socket.id);
            this.io.emit('new-client', socket.id);
        });
    }
}
module.exports = Socket;
否则,
将引用当前命名空间对象。如果不想使用箭头函数,可以执行以下操作:

this.emit('new-client',socket.id)

有关箭头函数的更多信息,请阅读以下问题&


使用箭头功能
this.io.on('connection',socket=>{})
run() {
    this.io.on('connection', function(socket) {
         console.log('new client has connect', socket.id);
         // this is referencing the Namespace
         this.emit('new-client', socket.id);
    });
}