0

我正在使用 Express 编写 Node.js 应用程序,并使用 node-postgres 编写 PostgreSQL 数据库。我想根据他们的电子邮件查找当前用户的用户名和真实姓名,并将它们设置在req.session中。但是,如果我在下面的代码中将它们设置在我所在的位置,当我们离开该块时它们是未定义的(即第一个 console.log 语句打印正确的信息,第二组打印未定义。我该如何解决这个问题?

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();
    });
4

1 回答 1

1

第二对console.log将在查询结果可用之前执行(在row事件处理程序中)。

如果您的代码将在 Express 路线中使用,您将使用如下内容:

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(使用 Express 恕我直言看起来更好):

  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
    });
于 2013-04-09T17:40:46.117 回答