如何修复NodeJS中的“无法读取未定义的属性”发射”错误

时间:2019-03-29 13:20:34

标签: 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.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)

1 个答案:

答案 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的更多信息。