0

这是代码:

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

这就是为什么不保存外部功能会话的原因?我的代码有什么问题?

在函数内部,一切都很好,在函数外部 - undefined

在这个会话之后,逻辑必须得到维护,并且在任何地方都可以使用,或者不是吗?

试图用session声明一个变量,但也没有用,而且没有报错不给,甚至不知道从哪里挖。

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

升级版:

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

如果您知道如何为我制定正确的执行顺序,请写下答案。

4

1 回答 1

0

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

于 2015-03-25T16:12:44.360 回答