我正在创建一个类来处理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)
答案 0 :(得分:0)
在回调函数中,this
不等于Socket
实例。
您需要使用.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
引用当前的命名空间对象。如果您不想使用箭头功能,则可以执行以下操作:
this.emit('new-client', socket.id)
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);
});
}
您可以阅读以下问题,以获取有关箭头功能和this
的更多信息。