2016-11-07 97 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