2014-01-19 2 views
8

Я видел много вариантов этого вопроса, но никто, похоже, не решил мою проблему. Я пытаюсь настроить сервер Node.js, используя Express. Вот моя конфигурация сервера:Невозможно получить доступ к переменным req.session в Express/NodeJS

var express = require('express'), 
    RedisStore = require('connect-redis')(express); 

var app = express(); 

app.use(express.urlencoded()); 
app.use(express.json()); 
app.use(express.cookieParser()); 
app.use(express.session({ 
    store: new RedisStore(), 
    secret: APP_SECRET 
})); 

// Initialize redis connection 
var client = redis.createClient(); 
client.on('connect', function() { 
    console.log('Connected to Redis server') 
}) 
client.on('error', function (err) { 
    console.log('Error ' + err); 
}); 

// Enable cross-origin resource sharing 
app.all('*', function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers', 'X-Requested-With'); 
    next(); 
}); 

var api = require('./controllers/api.js'); 

app.post('/login', api.login); 
app.get('/auth', api.auth); 

app.listen(3000); 

И вот несколько простых маршрутов:

exports.login = function(req, res) { 
    var user = new User(req.username, req.password); 
    req.session.user = user; 
    console.log(req.session.user); //works 
    res.json({user:user}); 
} 

exports.auth = function(req, res) { 
    console.log(req.session.user); //doesn't work 
    res.json(req.session.user); 
} 

Так что в моем login пути, я могу напечатать переменную сеанса, как и ожидалось. Но если я посетил маршрут auth после посещения маршрута login, переменная сеанса не определена. Как я могу получить Экспресс-сессии для работы?

+0

Глупый вопрос, но обработчики маршрута вы Отправленные фактически не посылает ответ. Вы пытались выполнить или переадресовать из «login»? Хотя ваш сеанс не сохраняется в файле cookie, cookie будет использоваться в процессе тем не менее. Если ответа нет, это никогда не вернет его в браузер. – juanpaco

+0

@juanpaco Я фактически отредактировал ответы, но я верну их обратно для ясности –

ответ

4

В типичном веб-приложении учетные данные, используемые для аутентификации пользователя, будут передаваться только во время запроса на вход. Если аутентификация завершается успешно, сеанс будет создан и поддерживается с помощью набора файлов cookie в браузере пользователя.

Каждый последующий запрос не содержит учетных данных или всех пользовательских данных, а скорее уникального файла cookie, который идентифицирует сеанс. Чтобы поддерживать сеансы входа в систему, вы должны сериализовать и десериализовать пользовательские экземпляры на сеанс и из него в каждом запросе.

В вашем случае вы назначили req.session.user = user; только в запросе /login. Он не будет доступен для дальнейших запросов (/auth).

Вы должны получить информацию о пользователе в запросе /auth по идентификатору сессии. (Или) Лучше вы можете использовать passport для аутентификации.

+1

Хорошо, мне нужно более подробное объяснение этого или примера. –

1

Я думаю, может быть, ваш REDIS клиент не подключается хорошо, попробовать что-то вроде этого, и быть уверенным, чтобы запустить службу REDIS

sudo service redis-server start 

или путь вы вызываете переменную взгляд RedisStore на примере

пример:

var express = require('express'); 
var app = express(); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var RedisStore = require('connect-redis')(session); 

app.set('port',process.env.PORT || 3000); 

app.use(cookieParser()); 
app.use(session({ 
    resave: true, 
    saveUninitialized: true, 
    store: new RedisStore({ 
     host: 'localhost', 
     port: 6379 
    }), 
    secret: 'some string/hash secret' 
})); 


var counter=0; 
app.get('/', function(request, response){ 
    //adding some value to request.session 

    counter = counter+1; 

    request.session.color = {'anyValue': counter}; 
    // 
    console.log('Session ID: ', request.sessionID); 
    console.log('Session: ', request.session); 
    response.send('some text counter: '+request.session.color['anyValue']); 

}); 


app.listen(app.get('port')); 
+0

Это сработало для меня. Благодарю. – souravb

1

Принятые в настоящее время ответ не понял, что express.session уже обрабатывает куки на основе сеансов с объектом req.session. Я попробовал урезать вашу версию, не используя redis, и это сработало. Глядя на документы connect-redis, похоже, вам нужно передать сеанс для соединения-redis. Вы в настоящее время передаете его экспресс. Я верю, что это изменит вашу проблему.

P.S. Я бы обновил ваши версии node/express, поскольку текущие версии express больше не имеют встроенного промежуточного программного обеспечения вместе с другими улучшениями.

Новые версии экспресс:

var session = require('express-session'); 
var cookieParser = require('cookie-parser'); 
var json = require('express-json'); 
var bodyParser = require('body-parser') 

Вместо:

express.session 
express.cookieParser 
express.json 
express.bodyParser 
Смежные вопросы