2016-11-07 5 views
0

Redisでセッションを設定しようとしています。私はドックコンテナに私のレディスDBを持っていて、私のアプリにリンクしています(ドックコンテナ内にもあります)。私はセッションを未定義にし続けています。私は最小限のものに戻って物事を取り除き、物事が実行される順序もチェックしました。私はまだ定義されていません。Express.jsセッションが未定義です。 Redis

私はここでは'session' is undefined when using express/redis for session storeExpress js session undefinedを読んだことがありません。

私は、cookie-parserを使用する必要はありません。なぜなら、expression-sessionにはCookieが含まれており、cookie-parserはexpression-sessionに問題を引き起こす可能性があるということです。

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); //未定義のログ res.send( 'Hello'); }); – Rob

答えて

2

再接続を確認してもう一度実行してください。サンプルコードは次の行です。

"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接続が失敗していると思っています...しかし、私はまだこれをチェックする方法を理解しようとしています。成功した接続をどのようにログアウトするのですか?パスワードをjunkに変更すると、エラーがスローされます(ただし、正しいパスワードが接続されている必要はありません)。 – Rob

+1

redislabs(https://redislabs.com)を使用してテストすることができます。 セッションは、コンピュータから要求があったときに発生します。 したがって、セッションのみが確立されていることを確認するだけでは不十分です。このため、カスタムデータを追加する必要があります。 このデータをチェックして取引を行うことができます。 ユーザーがログインすると、セッション値に追加されたカスタムデータとユーザーを区別できます。 –

+0

Redislabsでセットアップし、あなたの例をコピーした - それは動作します。私はRedisをどのようにインストールしたのかが原因です。ありがとう! – Rob

関連する問題