0

Express Frameworkを使用して、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 インスタンス変数にアクセスするにはどうすればよいですか?

4

2 に答える 2

1

thisinit 関数から削除するだけです。

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");
 });
于 2013-05-29T03:32:24.883 に答える
0

素敵なトリックをお見せしましょう。

カスタムを変更できます

var customEventEmitter;

this.customEventEmitter =null;

関数の上部にあります。その後、あなたは呼び出すことができます

var self = this;

クエリ関数の外側。次に、クエリ関数内で、外側の「this」をselfで参照します。

次のように:

self.customEventEmitter.emit()

今説明した方法論は標準的なものです。

于 2015-05-23T17:03:39.837 に答える