2014-01-19 6 views
8

この質問には多くのバリエーションがありますが、私の問題は解決していないようです。 Expressを使用してNode.jsサーバーを設定しようとしています。ここに私のサーバー構成がある:Express/NodeJSのreq.session変数にアクセスできない

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ルートに予想通り、私はセッション変数を印刷することができます。しかし、loginルートを訪問した後にauthルートにアクセスした場合、セッション変数は定義されていません。 Expressセッションを動作させるにはどうすればよいですか?

+0

愚かな質問が、あなたが実際に応答を送信しない掲示ルートハンドラ。 'login'からレンダリングやリダイレクトを試みましたか?あなたのセッションはクッキーに保存されませんが、クッキーはそのプロセスで使用されます。応答がない場合、それはブラウザに戻ることはありません。 – juanpaco

+0

@juanpaco私は実際に応答を編集しましたが、わかりやすくするために戻しておきます。 –

答えて

4

一般的なWebアプリケーションでは、ユーザーの認証に使用する資格情報は、ログイン要求中にのみ送信されます。認証が成功すると、セッションは確立され、ユーザのブラウザに設定されたクッキーを介して維持されます。

各後続の要求には、資格情報またはすべてのユーザーデータが含まれず、セッションを識別する固有のCookieが含まれます。ログインセッションをサポートするためには、すべてのリクエストでセッションとの間でユーザーインスタンスを直列化および逆シリアル化する必要があります。

あなたの場合、req.session.user = user;/loginリクエストにのみ割り当てられています。これ以上のリクエストは受け付けません(/auth)。

/authのユーザー情報もセッションIDで取得する必要があります。 (または)passportを認証に使うことをお勧めします。

+1

OK、これまたは例の詳細な説明が必要です。 –

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. 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 
関連する問題