2016-11-07 51 views
0

试图获得与Redis建立的会话。我有一个dokku容器中的Redis DB,链接到我的应用程序(也位于dokku容器中)。我一直没有定义会话。我已经将事情剥离到了最低限度,也检查了事情的执行顺序。我仍然没有定义。Express.js会话未定义。 Redis

我在这里读过'session' is undefined when using express/redis for session storeExpress js session undefined无济于事。

我不应该使用cookie解析器,因为表达式会话中有cookie的东西,文档说cookie解析器会导致表达式会话的问题。

var express = require('express'); 
var session = require('express-session'); 
var redisStore = require('connect-redis')(session); 
var bodyParser = require('body-parser'); 

var app = express(); 

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

var redisURL = 'redis://xxxxx:[email protected]:6379'; 
var store = new redisStore({ url: redisURL }); 

app.use(session({ 
    secret: 'ssshhhhh', 
    store: store, 
    saveUninitialized: true, 
    resave: true 
})); 


app.use(express.static(__dirname + '/public')); 
app.use(bodyParser.json()); // to support JSON-encoded bodies 
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies 
    extended: true 
})); 

app.get('/', function(req, res, next) { 
    console.log(req.session); // Logs Undefined 
    res.send('Hello'); 
}); 
+0

什么行号是错误和确切的错误信息 –

+0

@JasonLivesay它console.logs未定义。会话未定义。谢谢 – Rob

+0

app.get('/',function(req,res,next){ console.log(req.session); // Logs Undefined res.send('Hello'); }); – Rob

回答

2

检查您的redis连接并重新运行。示例代码如下所示。

"use strict"; 

const express = require("express"); 
const bodyParser = require("body-parser"); 
const session = require("express-session"); 
const RedisStore = require("connect-redis")(session); 

const app = express(); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: false})); 

app.use(session({ 
    secret: "$kx([email protected]<c-e$9", 
    resave: false, 
    saveUninitialized: true, 
    store: new RedisStore({ 
     url: "redis://:********@pub-redis-12766.eu-central-1-1.1.ec2.redislabs.com:12766", 
     ttl: 5 * 60 // 5 minute (Session store time) 
    }) 
})); 

app.use(function (request, response, next) { 
    let path = request.originalUrl; 

    if (request.session.user) { 
     request.session.reload(function (err) { //session expire time regenerate 
      if (!err) { 
       next(); 
      } else { 
       response.redirect('/login'); 
      } 
     }); 
    } else { 
     if (path == '/login') { 
      next(); 
     } else { 
      response.redirect('/login'); 
     } 
    } 
}); 

app.get('/', function(request, response) { 
    if (request.session.user) { 
     response.send(request.session.user); 
    } else { 
     response.redirect("/login"); 
    } 
}); 

app.get('/login', function(request, response) { 
    if (request.session.user) { 
     response.redirect("/"); 
    } else { 
     request.session.user = {username: "halil"}; //custom key {user} and custom data {username: "halil"} 
    } 

    response.send('Login'); 
}); 

app.get('/logout', function(request, response) { 
    if (request.session.user) { 
     request.session.destroy(); 
     response.redirect("/login"); 
    } else { 
     response.redirect("/login"); 
    } 
}); 

app.listen(app.get('port'), function() { 
    console.log('App is working on port: ' + app.get('port')); 
}); 
+0

感谢Halil Ibrahim SAFAK - 这也失败了(不过,我已经提高了它,因为它迄今为止见过的最好的示例代码)。我现在认为我的Redis连接失败了...但是,我仍然试图弄清楚如何检查这个。我将如何注销成功的连接?如果我将密码更改为垃圾 - 它会引发错误(但这并不意味着正确的密码正在连接)。 – Rob

+1

您可以使用redislabs(https://redislabs.com)进行测试。 从计算机发出请求时会发生会话。 因此,仅检查会话是否已建立是不够的。出于这个原因,有必要添加自定义数据。 您可以检查这些数据进行交易。 当用户登录时,您可以将用户与添加到会话值的自定义数据区分开来。 –

+0

设置Redislabs,并复制你的例子 - 它的工作原理。必须是由于我已经安装了Redis。谢谢! – Rob