2012-10-03 6 views
5

私はこの前にこれをやった...私はこの時間違っていることに従わないが、私は数時間苦労していて、今自分自身を考えている精神的にブロックされます。対応するコード:リクエストを処理する際に Nodejs:Express + RedisStore、req.session undefined

app.use(express.bodyParser()); 
app.use(i18next.handle); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public')); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'swig'); 
app.set('view cache', false); 
var session_store = new RedisStore({ client : redis_client}); 
app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); 
app.use(express.cookieParser()); 
app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); 
app.use(app.router); 

はその後、ここだけの例です:Redisのために

app.get('/session_test', function (req, res, next) { 
    console.log(req.session); //undefined 
}); 

の接続がうまく働いています。エラーは表示されません。次に、要求からアクセスしようとするとき、req.sessionは未定義です。ブラウザが正しいsidを送信しています。

リクエスト中に発生する正確なフローは専門家ではありませんが、デバッグ後はセッションミドルウェアの前にルーターが呼び出されたようです。

ありがとうございました。私はできる限りコードを提供しますが、私はあなたの助けになるかもしれないのか分かりません。

ここにコードがあります。 routes.settings.setupが呼び出されるまで server.js

//Dependency modules 
var express = require('express'), 
    app = express.createServer(), 
    //Application dependency modules 
    settings = require('./settings'), //app settings 
    routes = require('./routes'), //http routes 
    rtroutes = require('./rtroutes'); //real time communication routes (io) 

var io = require('socket.io').listen(app); 
var appWithSettings = settings.setup(io, app); 

routes.settings.setup(appWithSettings); 
rtroutes.settings.setup(io, appWithSettings); 

いいえルートが追加されます。設定(グローバル設定)は非常に大きなファイルです。これですべての設定が完了しました。 settings.setupメソッドが呼び出されるまで、設定は追加されません。私はいくつかの部分を遅らせたため、私は25本のルートは、4つの異なるファイル(何とか私は今までのセッションの必要性を持っていなかったに分割しており、必要なすべてのものは、マングースで行われた

//Dependency modules 
var express = require('express'), 
    redis = require('redis'), 
//Important configuration values 
var SESSION_SECRET = 'some secret thing which doesnt belong to stackoverflow!', 
    insert_other_variables_here = "lalala"; 

//Computed general objects 

var RedisStore = require('connect-redis')(express), 
    redis_client = redis.createClient(REDIS_PORT, REDIS_HOST); 

exports.setup = function (io, app) { 
    app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(i18next.handle); 
    app.use(express.methodOverride()); 
    app.use(express.static(__dirname + '/public')); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'swig'); 
    app.set('view cache', false); 
    var session_store = new RedisStore({ client : redis_client}); 
    app.use(express.errorHandler({ dumpExceptions : true, showStack : true})); 
    app.use(express.cookieParser()); 
    console.log("ABOUT TO ADD SESSION STORE MIDDLEWARE"); 
    app.use(express.session({ store : session_store, secret : SESSION_SECRET, key : "sid" })); 
    console.log("AND NOW ADDED THE SESSION STORE MIDDLEWARE"); 
    app.use(app.router); 
    }); 

    app.configure('development', function() { 
    //some things in here, but nothing that affects app. I have commented this 
    //for debugging and it changed nothing 
    }); 

    app.configure('production', function() { 
    //mostly configuration for io and some caching layers, as well as servers info 
    app.use(express.errorHandler()); 
    app.use(express.logger({ stream : logFile })); 
    }); 
    app.listen(WEB_PORT); 
    return { 
    app : app, 
    //some other stuff that isn't relevant 
    } 
} 

:ここでは、ファイルのカットです)。ここでは、(偽の名前で)行われているかの例です:

ルート/ index.js

export.settings = require("./settings"); 

ルート/ settings.js

exports.setup = function (app_settings) { 
    require("./route1")(app_settings); 
    require("./route2")(app_settings); 
    require("./route3")(app_settings); 
}; 

ここで取り除か "route1のは" ですファイル( "routes/route1.js"):

module.exports = function (app_settings) { 
    var app = app_settings.app; 
    console.log("ABOUT TO ADD ROUTES") 
    app.get("/signin", function (req, res, next) { 
    console.log(req.session); //this will be undefined 
    }); 
    app.get("/register", function (req, res, next) { 
    }); 
    app.get('/language', function (req, res, next) { 
    }); 
    app.post('/settings', function (req, res, next) { 
    }); 
    console.log("ADDED ROUTES NOW!") 
} 
+0

寝てみてください:app.use(express.session({ストア:session_store、秘密:SESSION_SECRET、キー: "SIDを"})); – chovy

+0

私の悪い、私はコードを2回貼り付けました(すべての行がそこに2回ありました) – Mamsaac

+0

はその問題を修正しましたか?私はあなたがreqを使っているところを見ません。セッション – chovy

答えて

9

ルートを定義するたびに、ルータは自動的に中間に挿入されますWareスタックはその時点で(それ以降の意図的な挿入は無視されます)。セッションハンドラを設定する前にルートを定義していないのですか?

+0

はい。それは私の心を巡ってきたアイデアなのです...だから、セッションミドルウェアを追加する前後にconsole.logを置きます。また、ルートを追加する前後にセッションを出力します(追加の前後) 。ミドルウェアの注文が私の何らかのアクションによってリセットされる可能性はありますか? – Mamsaac

+0

あなたは 'static'の呼び出しを' router'の呼び出しの後に動かすことができます。私は 'i18next'に慣れていないので、それが問題を引き起こしているかどうかはわかりません。 'errorhandler'をスタックの最後まで動かすこともできます。今のところ、 'session'に由来するエラーがない可能性があります。 – ebohlman

+0

i18nextとエラーハンドラが修正されずにコメントアウトしました。私はapp.router(私はそれのためのnginxを使用して以来、私は生産のための静的を無効に注意してください)の下に静的に移動し、まだ助けになりませんでした。私はまだあなたが正しい軌道に乗っていると思っていますが、私はどこでうんざりしたのか分かりません:( – Mamsaac

3

これを更新するのを忘れてしまった:Ebohlmanが正しい軌道に乗ってくれました。

i18nextでした。 initメソッドの1つを呼び出すとき、ルートを設定し、app.routerを強制的にハンドルスタックに強制的に強制していました。私の悪い、私は、コードの一部がアプリケーションオブジェクトと対話していたことを認識していませんでした。 質問には、私が与えた情報をどうやって行ったのかよりもよく答えることができなかったので、私は彼の答えを正しいものとしてマークしています。

私はあなたが二回そこにこのラインを持っているより多くのv.v