0

Express を使用して Node.js アプリケーションを作成し、node-postgres を使用して PostgreSQL データベースを作成しています。電子メールに基づいて現在のユーザーのユーザー名と本名を検索し、req.session に設定したいと考えています。ただし、以下のコードでそれらを設定すると、そのブロックを離れると未定義になります (つまり、最初の console.log ステートメントは正しい情報を出力し、2 番目のセットは undefined を出力します。これを解決するにはどうすればよいですか?

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

の 2 番目のペアは、(イベント ハンドラーで)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 IMHO の方が見栄えがします)。

  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 に答える