gpt4 book ai didi

node.js - 如何修复 NodeJS 中的 ‘Cannot read property ' 发出“未定义”错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:52 25 4
gpt4 key购买 nike

我正在创建一个类来处理 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 不等于 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 的更多信息。

关于node.js - 如何修复 NodeJS 中的 ‘Cannot read property ' 发出“未定义”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com