2013-04-09 45 views
0

我正在写使用Express和使用节点的Postgres一个PostgreSQL数据库的Node.js应用程式。我想根据他们的电子邮件查询当前用户的用户名和真实姓名,并将其设置为req.session。但是,如果我现在就写,我在下面的代码中,它们是不确定的,当我们离开这个块(即第一的console.log报表打印正确的信息,未定义第二盘打印。我怎样才能解决这个问题?如何从此范围设置req.session?

var client = new pg.Client(app.conString); 
    var realname = ""; 
    var username = ""; 

    client.connect(); 
    var query = client.query(
     "SELECT * FROM users WHERE email = $1;", 
     [req.session.email] 
    ); 

    query.on('row', function(row) { 
     req.session.realname = row.realname; 
     req.session.username = row.username; 
     console.log(req.session.realname); 
     console.log(req.session.username); 
    }); 

    console.log(req.session.realname); 
    console.log(req.session.username); 

    query.on('end', function() { 
     client.end(); 
    }); 

回答

1

第二对console.log如果你的代码将在快递航线使用将执行查询的结果都可以(在row事件处理程序)之前

,你会使用这样的:

app.get('/', function(req, res) { 
    var client = new pg.Client(app.conString); 
    var realname = ""; 
    var username = ""; 

    client.connect(); 
    var query = client.query(
    "SELECT * FROM users WHERE email = $1;", 
    [req.session.email] 
); 

    query.on('row', function(row) { 
    req.session.realname = row.realname; 
    req.session.username = row.username; 
    }); 

    query.on('end', function() { 
    client.end(); 
    res.send(...); // <-- end the request by sending back a response 
    }); 
}); 

使用EventEmitter接口node-postgres是只传递一个回调query(看起来更好地与快递恕我直言)的替代:

client.query(
    "SELECT * FROM users WHERE email = $1;", 
    [req.session.email], 
    function(err, results) { 
     if (err) 
     // handle error 
     else 
     if (results.length) 
     { 
     req.session.realname = results[0].realname; 
     req.session.username = results[0].username; 
     } 
     res.send(...); // done 
    }); 
+0

完美的感谢。我的大脑仍然没有异步思考! – tsvallender 2013-04-09 17:47:06

+0

有时可能会让人困惑,但使用它越多,它就越容易变得:) – robertklep 2013-04-09 17:48:21