【问题标题】:How to fix ‘Cannot read property 'emit' of undefined’ error in NodeJS如何修复 NodeJS 中的“无法读取未定义的属性 'emit'”错误
【发布时间】:2019-08-20 10:46:33
【问题描述】:

我正在创建一个类来处理 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)

【问题讨论】:

  • 使用箭头函数。 this.io.on('connection', socket =&gt; { })

标签: node.js class ecmascript-6 socket.io


【解决方案1】:

在回调函数内部,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 的更多信息。

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 2019-08-31
    • 2021-06-27
    • 2020-01-20
    • 2019-02-10
    • 2022-01-06
    • 2020-10-09
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多