Node.js 无法读取未定义的 属性 'on'

Node.js Cannot read property 'on' of undefined

怎么了?

p.s。 : 我是 node.js 的新手,我来自 .Net 世界!

我的 server.js 代码:

    var events = require('events').EventEmitter;
    var v = function() {
        var e = new events();
        e.emit('start');
    };

    var r = v();
    r.on('start', function(){
        console.log('event start just fired!!!!!!!!!!');
    });

并且此控制台输出:

TypeError: Cannot read property 'on' of undefined
    at Object.<anonymous> (E:\Project\node\BasicSocial\server.js:12:2)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Function.Module.runMain (module.js:442:10)
    at startup (node.js:136:18)
    at node.js:966:3

您忘记了 return 来自 v 函数的事件发射器:

var v = function() {
    var e = new events();
    e.emit('start');
    return e;
};

另请注意,start 事件将不会被调用,因为您在订阅之前已发出该事件。所以你可以稍微修改一下你的代码:

var events = require('events').EventEmitter;
var v = function() {
    var e = new events();
    return e;
};

var r = v();
r.on('start', function(){
    console.log('event start just fired!!!!!!!!!!');
});

// emit the event after you have subscribed to the start callback
r.emit('start');

r 未定义,因为 v 没有 return 任何东西。这就是你收到错误的原因。即使您 return 事件,您的代码也不会为您提供所需的输出,因为您需要在使用 emit("start")

之前使用 on("start")
var events = require('events').EventEmitter;

var e = new events();

e.emit('start'); //This won't trigger the console.log

//Need to be binded before you emit the event.
e.on('start', function(){
    console.log('event start just fired!!!!!!!!!!');
});

e.emit('start'); //This will trigger the console.log

您也可以使用 Process.nextTick()setTimeout(yourFunction,0)

这两个函数在您发射和使用回调函数时会派上用场。

在这里,使用 nextTick 函数,我可以将函数推送到事件循环中,该事件循环将在调用堆栈中的所有进程执行完后执行,即最后。

var EventEmitter = require('events').EventEmitter;

var getValue = function(val){
    var e = new EventEmitter();
    process.nextTick(function(){
        var c = 0;
        e.emit('Start');
        var t = setInterval(function(){
            e.emit('Processing data', ++c);
            if(c==val){
                e.emit('Stopped',c);
                clearInterval(t);

            }
        },10);

    });
    return e;
}

var r = getValue(7);

r.on('Start', function(){
    console.log("Started");
});

r.on('Processing data', function(d){
    console.log('Data '+d);
});

r.on('Stopped', function(d){
    console.log('Stopped '+d)
});

制作事件对象前一定要忘记写new

const events=require("events");
const event=***new*** events.EventEmitter();
event.on('click' ,() => console.log("hello"));
event.emit('click');