2013-04-09 2 views
0

Я пишу приложение Node.js, используя Express и базу данных PostgreSQL, используя node-postgres. Я хочу найти имя пользователя и настоящее имя текущего пользователя на основе их электронной почты и установить их в 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

+0

Иногда это может сбивать с толку, но чем больше вы его используете, тем легче становится :) – robertklep

Смежные вопросы