2013-11-27 5 views
1

Я пытаюсь получить доступ к данным сеанса в экспресс, поэтому я подумал, что я попытаюсь объявить хранилище сеанса connect-redis при настройке экспресс. Однако я не понимаю, почему это не работает:Использование RedisStore в nodejs/expressjs

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

var app = express(); 
app.set('port', process.env.PORT || 3000); 
app.use(express.bodyParser()); 
app.use(express.cookieParser()); 
app.use(express.session({ secret: "keyboard cat", store: new RedisStore })); 
//app.use(express.session({ secret: "keyboard cat" })); 
app.use(app.router); 

app.get('/', function(req, res){ 
    console.log('/'); 
    req.session.items = [ 'apple', 'orange' ]; 
    res.end('items configured'); 
}); 

app.get('/items', function(req, res){ 
    console.log('/items: ', req.session.items); 
    var s = JSON.stringify(req.session.items); 
    res.end('items: ' + s); 
}); 

var server = http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Маршрут '/' просто настраивает элементы с сеансом.

Маршрут «/ items» отображает список элементов в сеансе.

Он работает, используя стандартный магазин сеансов ExpressJS. Это не работает с использованием connect-redis (req.session не определено)

Я предполагаю, что хранилище redis будет создано и уничтожено, когда приложение загружает/выгружает (или мне нужно, чтобы он работал за пределами узла/экспресс-приложение?)

Любые идеи?

+0

Добавить Node.js тег в ваш вопрос, чтобы получить больше внимания/взгляды – thenewseattle

ответ

1

req.session будет неопределенным, если RedisStore не может подключиться к серверу Redis. Таким образом, он либо не работает, либо не работает в местоположении по умолчанию, которое ищет RedisStore (127.0.0.1:6379).

В случае последнего вы можете настроить местоположение с помощью аргумента options в конструкторе RedisStore.

+0

А я думал, что сервер redis запущен узлом - я вижу, что это отдельный серверный процесс. Я буду использовать expressjs MemoryStore в качестве хранилища вместо запуска нового сервера. – user2964941

0

Вы должны вызывать RedisStore конструктор (с())

app.use(express.session({ secret: "keyboard cat", store: new RedisStore()})); 
+0

На самом деле, 'новый RedisStore' тоже работает. – robertklep

+0

в порядке, это JS удивительность! –

+0

Я тоже предпочитаю круглые скобки. Если только заткнуть 'jshint';) – robertklep

0

Дайте это попробовать.

var express = require('express'); 
var redis = require("redis"); 
var session = require('express-session'); 
var redisStore = require('connect-redis')(session); 
var bodyParser = require('body-parser'); 
var client = redis.createClient(); 
var app = express(); 

app.set('views', __dirname + '/views'); 
app.engine('html', require('ejs').renderFile); 

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.get('/',function(req,res){ 
    // create new session object. 
    if(req.session.key) { 
     // if email key is sent redirect. 
     res.redirect('/admin'); 
    } else { 
     // else go to home page. 
     res.render('index.html'); 
    } 
}); 

app.post('/login',function(req,res){ 
    // when user login set the key to redis. 
    req.session.key=req.body.email; 
    res.end('done'); 
}); 

app.get('/logout',function(req,res){ 
    req.session.destroy(function(err){ 
     if(err){ 
      console.log(err); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

app.listen(3000,function(){ 
    console.log("App Started on PORT 3000"); 
}); 

ссылка: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

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