调用Node模块类方法报Cannot read property 'on' of undefined如何解决?
问题根因
- 最初
Cannot read property 'on' of undefined报错原因:listenUDP方法默认无返回值,调用后返回undefined,对undefined调用on方法自然触发类型错误,添加return this.server解决报错属于正确操作。 - 解析后的
tally数据丢失原因:processTally方法中的this.emit('message', tally)是将事件挂载在TSL5类的实例对象上,而非UDP socket实例上。你当前只监听了UDP socket的message事件获取原始二进制数据,没有监听TSL5实例的message事件,自然收不到解析完成的结构化数据。 - 隐藏风险:你当前全局只实例化了一个
TSL5对象,当需要监听多个端口时,多次调用listenUDP会覆盖this.server属性,导致之前的端口监听逻辑异常。
解决方法
推荐每个监听端口对应独立的TSL5实例,直接监听TSL5实例抛出的解析后数据即可,修改服务端代码对应逻辑:
// 每个端口独立实例化TSL5,避免属性覆盖冲突 const umd = new TSL5(); source_connections[i].server = umd.listenUDP(port); // 监听TSL5实例的message事件,拿到processTally处理后的tally数据 umd.on('message', function (tally) { processTSL5Tally(sourceId, tally); });
如果需要同时获取UDP原始二进制数据,可以保留对socket实例的message事件监听,两类事件监听互不冲突。
另外请确认你的TSL5模块头部已正确引入依赖:
const EventEmitter = require('events'); const dgram = require('dgram'); const debug = require('debug')('tsl5'); // 如果你使用了debug调试工具
内容的提问来源于stack exchange,提问作者JTF4
相关产品推荐
相关产品推荐

