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

时间:2016-01-31 17:14:15

标签: javascript node.js events javascript-events

出了什么问题?

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

我的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

4 个答案:

答案 0 :(得分:8)

您忘记从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');

答案 1 :(得分:1)

r未定义,因为v没有返回任何内容。这就是你收到错误的原因。即使您返回该活动,您的代码也无法提供所需的输出,因为您需要在使用on("start")之前使用emit("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

答案 2 :(得分:0)

您也可以使用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)
});

答案 3 :(得分:0)

在制作事件对象之前,您必须忘了编写新内容

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