如何在类的任何位置访问node.js的实例变量

时间:2013-05-28 22:16:53

标签: node.js express

我正在使用 express框架在postgresql上使用 node.js 应用程序。我试图尽可能地遵循MVC。

我想在模型类中生成查询结果,然后将它们传递给控制器​​类。该控制器类实际上是在路由中定义的,因此控制器类可以获取结果并将它们作为http响应传递。

这是我的数据库助手类,即模型类。 我的问题出在班级最后的听众身上

exports.DatabaseHelper = function()
{
    var allVenues;
    var client;
    var customEventEmitter;

    this.init = function()
    {
        this.customEventEmitter = new events.EventEmitter();


        client = new pg.Client(
        {
            host:'localhost',
            port:5432,
            database:'postgres',
            user:'postgres',
            password:'password'
        });
    }



    this.getVenuesWithEvents = function(searchParams)
    {
        allVenues = new Array();

        var query_for_venues;

        this.init();

        client.connect();   

        client.addListener("error",function()
        {
            sys.puts("postgresql interface error");
        });

        query_for_venues = client.query("select id, name, location, latitude, longitude, category_generalized from venues");


        query_for_venues.addListener("row",function(row)
        {
            //some code
        });

        query_for_venues.addListener("end",function(result)
        {
                this.customEventEmitter.emit("data",allVenues);
//////////////////////////////////////////////////////////                  
//this line shows error....'this' refers to the query object so customEventEmitter is undefined
//customEventEmitter is my idea of sharing the query results to my controller class.
//but I cannot do this becasue of this error

                console.log("after emission");
        });
    }

}

如何从侦听器中访问customEventEmitter实例变量?

2 个答案:

答案 0 :(得分:1)

只需从初始化函数中删除this

this.customEventEmitter = new events.EventEmitter();

所以你会:

customEventEmitter = new events.EventEmitter();

在你的听众中只发出没有this的发射器,如下所示:

query_for_venues.addListener("end",function(result){
            customEventEmitter.emit("data",allVenues);

            console.log("after emission");
 });

答案 1 :(得分:0)

让我告诉你一个很好的伎俩。

您可以更改自定义

var customEventEmitter;

this.customEventEmitter =null;

在函数的顶部。然后你可以打电话

var self = this;

在查询功能之外。然后在查询函数中用self引用外部的“this”。

如:

self.customEventEmitter.emit()

我刚才描述的方法是标准的。