ArsenBespalov
@ArsenBespalov
Сам себе разработчик

Почему не сохраняется сессия?

Вот код:

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.

Ведь это сессия, по логике должна сохраняться везде и быть доступна тоже везде, или не так?

UPD:

Пробовал объявить переменную с сессией, но это также не сработало, при этом никаких ошибок не выдает, даже не знаю куда копать.

var sess;
app.get('/vklogin', function(request, response) {
	sess = request.session;
	// Дальше код не очень интересный
});
  • Вопрос задан
  • 584 просмотра
Решения вопроса 1
zenwalker
@zenwalker
0xABADBABE
Ваша проблема в непонимании того, как работает JavaScript. Коллбек переданный в `https.request` будет выполнен уже после того, как вы проверите существование переменной, хранящейся в сессии. Гуглим описание работы event loop и асинхронности в JavaScript.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы