2012-10-03 31 views
5

Tôi đã làm điều này trước đây ... Tôi không làm theo những gì tôi đang làm sai thời gian này, nhưng tôi đã đấu tranh cho một vài giờ và bây giờ xem xét bản thân mình bị chặn về tinh thần. Mã tương ứng: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); 

Sau đó, khi xử lý yêu cầu, đây chỉ là một ví dụ:

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

Kết nối với redis đang làm việc tốt. Không có lỗi nào được hiển thị. Sau đó, khi cố gắng truy cập nó từ yêu cầu, req.session là không xác định. Trình duyệt đang gửi đúng sid.

Tôi không có chuyên gia về luồng chính xác xảy ra trong khi yêu cầu, nhưng sau khi gỡ lỗi, có vẻ như bộ định tuyến đã được gọi trước phần mềm trung gian phiên.

Cảm ơn trước vì bất kỳ và tất cả sự trợ giúp có khả năng. Tôi sẽ cung cấp bất kỳ mã nào tôi có thể, tôi không chắc chắn những gì có thể là sự giúp đỡ của bạn.

Đây là mã khác. 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); 

Không có tuyến đường nào được thêm cho đến khi routes.settings.setup được gọi. cài đặt (là cài đặt chung) là một tệp khá lớn. Đó là nơi tất cả các cấu hình được thực hiện. Cài đặt không được thêm cho đến khi phương thức settings.setup cũng được gọi. Dưới đây là một vết cắt của tập tin:

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

Tôi đã 25 tuyến đường chia làm 4 file khác nhau (bằng cách nào đó tôi không có nhu cầu cho phiên đến nay, kể từ khi tôi đã trì hoãn một số bộ phận và mọi thứ cần thiết đã được thực hiện với Mongoose). Dưới đây là một ví dụ về cách nó đang được thực hiện (với tên giả):

tuyến/index.js

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

tuyến/settings.js

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

Dưới đây là một tước ra "route1" tệp ("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

bạn có dòng này trong đó hai lần: app.use (express.session ({cửa hàng: session_store, bí mật: SESSION_SECRET, chìa khóa: "sid"})); – chovy

+0

Tệ của tôi, tôi dán mã hai lần (tất cả các dòng đều hai lần trong đó) – Mamsaac

+0

đã khắc phục được sự cố chưa? Tôi không thấy nơi bạn đang sử dụng req.phiên – chovy

Trả lời

9

Bất cứ khi nào bạn xác định lộ trình, bộ định tuyến sẽ tự động được chèn vào phần giữa ware stack là vào thời điểm đó (các nỗ lực tiếp theo để chèn nó một cách có chủ ý sẽ bị bỏ qua). Bạn có chắc bạn không định nghĩa bất kỳ tuyến đường nào trước khi bạn đặt trình xử lý phiên không?

+0

Có. Vì vậy, tôi đặt console.log ngay trước và sau khi thêm phần mềm trung gian phiên, và trước và sau khi thêm tuyến đường và đầu ra đến trước cho phiên (nhưng trước và sau khi thêm) và sau đó cho tuyến đường . Có thể thứ tự middleware được đặt lại bởi một số hành động của tôi? – Mamsaac

+0

Bạn có thể thử di chuyển lệnh gọi 'static' của bạn đến sau khi gọi' router'. Tôi không quen thuộc với 'i18next' vì vậy tôi không biết liệu điều đó có thể gây ra vấn đề hay không. Bạn cũng có thể thử di chuyển 'errorhandler' đến cuối ngăn xếp; có thể là bây giờ, nó thiếu một lỗi bắt nguồn từ 'phiên'. – ebohlman

+0

Tôi đã nhận xét i18next và errorhandler mà không bị lỗi. Tôi di chuyển tĩnh dưới app.router (thông báo tôi vô hiệu hóa tĩnh cho sản xuất, kể từ khi tôi sử dụng nginx cho rằng) và vẫn không giúp đỡ. Tôi vẫn nghĩ rằng bạn đang đi đúng hướng, nhưng tôi không chắc chắn nơi tôi đã say mê: ( – Mamsaac

3

Quên để cập nhật điều này: Ebohlman đặt tôi đi đúng hướng.

Đó là i18next. Khi gọi một trong các phương pháp init nó thiết lập các tuyến đường và nó đã buộc app.router bị buộc vào ngăn xếp xử lý sớm hơn. Xấu của tôi, tôi đã không nhận ra rằng một phần của mã đã được tương tác với các đối tượng ứng dụng và nó đã làm. Không có cách nào câu hỏi có thể đã được trả lời tốt hơn so với cách ông đã làm với các thông tin tôi đã đưa ra, vì vậy tôi đánh dấu câu trả lời của mình là đúng.

tôi nên cố gắng ngủ nhiều hơn etc.

Các vấn đề liên quan