首页 > 解决方案 > 自定义模块中的 EventEmitter 抛出“.on(...) 不是函数”

问题描述

我想从我的 Nodejs 模块发出事件,但它没有按预期工作,因为我们收到一个错误: Uncaught TypeError: Test.on(...) is not a function.

这是模块test.js

var util         = require("util");
var EventEmitter = require("events").EventEmitter;

function Test() {
  EventEmitter.call(this);
}

Test.prototype.test = function (input) {
  this.emit("testevent", input);
};

util.inherits(Test, EventEmitter);

module.exports = Test;

index.js我们有以下内容:

const Test = new (require('./test.js'));
Test.on('testevent', function (test) {
  console.log('emitted', test);
});
// Test.test('input');

我只知道index.js事件中的代码永远不会被发出,因为Test.test('input');没有被调用。

但是,由于禁用了该行,我对为什么得到Uncaught TypeError: Test.on(...) is not a function.

一旦取消注释,错误就会消失,Test.test('input');并且事件似乎已发出,因为我可以看到记录的行。但为什么?如果线路被禁用,为什么会抛出该错误?我们做错了什么?

标签: javascriptnode.jseventseventemitter

解决方案


使用const Test = new (require('test.js'));你是 requiretest.js模块node_modules,有一个,因为你没有 MODULE_NOT_FOUND 错误,但这是你真正想要的文件,或者这应该是具有真实路径的本地文件const Test = new (require('./test.js'));

取消注释此行后Test.test('input');,这不太可能记录任何内容,因为此代码发出test事件并且您的代码testevent仅在侦听。

一般来说,这段代码运行良好,这里是一个例子https://repl.it/repls/DiscreteUnwrittenNet


推荐阅读