2012-10-03 19 views
5

Ben yanlış bu sefer ne yapıyorum uymayan ... daha önce yapmış tanımsız ama kendimi düşünün şimdi birkaç saat için mücadele ettik ve zihinsel engellendi. İlgili kod: istekleri işlerken Nodejs: Ekspres + RedisStore, req.session

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); 

Sonra burada sadece bir örnek: REDIS için

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

Bağlantı gayet güzel çalışıyor. Hata gösterilmiyor. Daha sonra, istek üzerine erişmeye çalışırken req.session tanımlanmamıştır. Tarayıcı doğru sid'i gönderiyor.

Ben isteği sırasında meydana kesin akışına hiçbir uzman değilim, ama hata ayıklama sonra, yönlendirici oturumu katman önce çağrıldığını sanki görünüyor.

herhangi için şimdiden teşekkür ederiz ve tüm muhtemel bir yardım. Yapabileceğim herhangi bir kodu vereceğim, yardımın ne olabileceğinden emin değilim.

İşte daha kod. routes.settings.setup denir dek 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); 

yok rotalar eklenir. Ayarlar (genel ayar olan) oldukça büyük bir dosyadır. Bütün konfigürasyonların yapıldığı yer burası. Ayarlar, settings.setup yöntemi de çağrılana kadar eklenmez. Bazı parçalar geciktirerek beri Ben 25 yolları, 4 farklı dosyaları (nedense şimdiye kadar oturum için bir ihtiyaç yoktu bölünmüş olduğu ve gereken her şeyi Gelincik ile yapıldı

//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 
    } 
} 

: Burada dosyanın bir kesim var).

yolları/index.js

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

yolları/İşte

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

settings.js dışarı soydu "route1" var: İşte bir (sahte isimlerle) o yapılıyor nasıl örnek dosya ("yollar/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

uyku denemelisiniz: app.use (express.session ({mağaza: session_store gizli: SESSION_SECRET anahtar: "sid"})); – chovy

+0

Kötümü, kodu iki kez yapıştırdım (tüm satırlar iki kere içeride idi) – Mamsaac

+0

sorunu çözdü mü? Req kullandığınızı görmüyorum.oturum – chovy

cevap

9

Bir rota belirlediğinizde, yönlendirici otomatik olarak ortadaki her yere takılır. eşya yığını zamanında (kasıtlı olarak eklemek için sonraki girişimler göz ardı edilecektir). Oturum işleyicisini ayarlamadan önce herhangi bir rota tanımlamadığınızdan emin misiniz?

+0

Evet. Bu fikrimi harekete geçiren bir fikir ... Bu yüzden hemen önce ve sonra oturum ara katman yazılımı ekledikten sonra konsol.log'u koydum ve rotaları eklemeden önce ve sonra çıktılar (önce ve sonra ekledikten sonra) ve sonra yollar için çıktılar. . Ara katman siparişinin, benim bazı eylemlerimle sıfırlanması mümkün mü? – Mamsaac

+0

'Statik 'çağrınızı' yönlendiricinin çağrılmasından sonra' hareket ettirmeyi deneyebilirsiniz. Ben 'i18next' ile aşina değilim, bu yüzden soruna neden olup olmayacağını bilmiyorum. Ayrıca "errorhandler" ı yığının sonuna taşımayı deneyebilirsiniz; Şimdi olduğu yerde, 'session' kaynaklı bir hata eksik olabilir. – ebohlman

+0

Sabit olmadan o18next ve errorhandler yorumladı. Ben app.router altındaki statik taşıdım (bunun için nginx kullandığım için üretim için statik'i devre dışı bıraktığımı fark ettim) ve hala yardımcı olmadım. Hala doğru yolda olduğunuzu düşünüyorum, ama nerede mahvettiğimden emin değilim :( – Mamsaac

3

Bunu güncellemeyi unuttuysanız: Ebohlman beni doğru yola koydu.

Bu i18next idi. Init yönteminden birini çağırırken, rotaları ayarlar ve app.router'unun tanıtıcı kümeye daha önce zorlanmasını zorluyordu. Kötü, kodun bir kısmının uygulama nesnesiyle etkileşimde olduğunu fark etmedim ve yaptı. Sorunun, verdiğim bilgilerle nasıl olduğundan daha iyi bir şekilde yanıtlanabilmesi mümkün değildi, bu yüzden cevabını doğru olarak işaretliyorum.

Bunu iki kere orada hattı var daha v.v