我正在使用 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实例变量?
答案 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()
我刚才描述的方法是标准的。