Node.js:为什么不保存会话?

时间:2015-03-21 17:34:36

标签: node.js express express-session

以下是代码:

app.get('/vklogin', function(request, response) {
console.log('Авторизация через соц.сеть "Вконтакте"'.green);

var url_parts = url.parse(request.url, true);
var query = url_parts.query;
var data = querystring.stringify({
  client_id: '4836170',
  client_secret: 'cPkR53zhon0lU7TAiz9f',
  code: query.code,
  redirect_uri: 'http://' + request.headers.host + '/vklogin'
});
var options = {
  host: 'oauth.vk.com',
  port: 443,
  path: '/access_token?' + data,
  method: 'GET'
};
var httpsreq = https.request(options, function(response) {
  response.setEncoding('utf8');
  response.on('data', function(chunk) {
    var chunk = JSON.parse(chunk);
    pg.connect(dbconfig, function(err, client, done) {
      if (err) {
        return console.error('Ошибка подключения к БД',err);
      }
      client.query('select * from users where vk = $1', [chunk.user_id], function(err, result) {
        done();
        if (err) {
          console.error('Ошибка получения данных',err);
        } else {
          if (result.rows[0]) {
            console.log(result.rows[0]);
            request.session.authorized = true;
            request.session.userid = result.rows[0].id;
          } else {
            console.log('Попытка создания нового пользователя. ');
            client.query("insert into users (email, vk) values ('" + chunk.email + "', " + chunk.user_id + ") returning id", function(err, result) {
              done();
              if (err) {
                console.error('Ошибка записи данных в БД', err);
              } else {
                request.session.authorized = true;
                request.session.userid = result.rows[0].id;
                console.log('Добавлен новый пользователь # ' + result.rows[0].id);
              }
            });
          }

        }
        client.end();
      });
      console.log("№ пользователья: " + request.session.userid);
    });
  });
});
httpsreq.end();
if (request.session.authorized) {
  response.writeHead(301, {
    Location: 'http://' + request.headers.host + '/cabinet'
  });
} else {
  response.writeHead(301, {
    Location: 'http://' + request.headers.host
  });
}
response.end();
});

这就是为什么外部功能会话没有保存?我的代码出了什么问题?

在功能内部,一切都很好,外部功能 - 未定义

在本次会议之后,逻辑必须得到维护并随处可用,无处不在,还是不是?

试图用会话声明一个变量,但它也没有用,没有错误也没有给出,甚至不知道在哪里挖。

var sess;
app.get('/vklogin', function(request, response) {
  sess = request.session;
  // other code...
});

UPD:

我的问题与缺乏对异步进程控制的理解有关。我无法理解如何执行原来的 - 数据库查询,会话中的信息保存,然后检查会话变量并转发到所需的页面。

如果你知道如何为我做出正确的执行命令,请写下答案。

1 个答案:

答案 0 :(得分:0)

好的,我发现需要异步模式。看这里:http://book.mixu.net/node/ch7.html