node.js - 如何修复 NodeJS 中的“无法读取未定义的属性“发出”错误
问题描述
我正在创建一个类来处理 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
。
推荐阅读
- flutter - Flutter 应用程序执行同一行代码 5 次
- reactjs - 在安装选择期间无法选择第一个元素
- python - 期望不正确匹配模式
- javascript - 使用 Ramda 重构 if 语句
- facebook - 您如何在 Facebook 中验证用户拥有的子域?
- entity-framework-core - EF 核心。当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Book”中插入标识列的显式值
- c# - 如何使用 C# 附加范围报告 4.1.0?
- sql - 对此 ERD 的一部分进行建模的不同方法
- ios - 为什么具有相同像素比的手机上 2 个元素的高度不同?
- ipa - 为什么 PAM 身份验证在重启后不再需要 OpenVPN 服务器上的 2FA?