【问题标题】:EventEmitter inside custom module throwing '.on(...) is not a function'自定义模块中的 EventEmitter 抛出“.on(...) 不是函数”
【发布时间】:2020-01-11 03:08:05
【问题描述】:

我想从我的 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');,错误就会消失,并且事件似乎已发出,因为我可以看到记录的行。但为什么?如果线路被禁用,为什么会抛出该错误?我们做错了什么?

【问题讨论】:

    标签: javascript node.js events eventemitter


    【解决方案1】:

    使用const Test = new (require('test.js'));,您需要来自node_modulestest.js 模块,并且有一个因为您没有 MODULE_NOT_FOUND 错误,但这是您真正需要的文件,或者这应该是本地文件现实路径const Test = new (require('./test.js'));

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

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

    【讨论】:

    • 糟糕,这些是拼写错误。我编辑了问题以反映,但实际上我们需要一个相对路径 ./test.js 并且事件名称也是一个错字。它应该是testevent。有了这些变化,会有什么不同吗?
    • 正如您在repl.it上的示例中看到的那样,此代码没有问题,如果仍然有问题,请提供有关您的环境的信息,例如节点版本,操作系统。
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2020-07-02
    • 2014-07-14
    • 2020-08-03
    • 2021-11-10
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多