2012-03-01 28 views
5

Tôi hiện đang có thời gian để lưu các phiên trong MongoDb.NodeJS + Express + Mongo Bộ nhớ phiên

Tôi đã thử Express-session-mongo và connect-mongodb và cả hai cung cấp cho tôi cùng một "500 lỗi máy chủ nội bộ" khi tôi cố gắng tải trang đăng nhập. Điều này khiến tôi nghĩ rằng có thể có một cuộc xung đột với mongoose-auth ở đâu đó.

Dù sao đây là thiết lập của tôi:

app.js:

var MongoStore = require('connect-mongodb'); 
var MongoDb = require('mongodb').Db; 
var Server = require('mongodb').Server; 

var db = new MongoDb('myDb', new Server('localhost', 27017, {auto_reconnect: true, native_parser: false})); 

app.configure(function() { 
    app.use(express.logger({format: 'dev'})); 
    app.set('views', __dirname + '/../views'); 
    app.set('view engine', 'jade'); 
    app.set('view options', { layout: false }); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(mongooseAuth.middleware()); 
    app.use(require('./mysite').middleware()); 
    app.use(express.methodOverride()); 
}); 


app.configure('production', function(){ 
    var oneWeek = 657450000; 
    app.use(express.static(__dirname + '/../public', { maxAge: oneWeek })); 
    app.use(express.session({ store: new MongoStore({db: db}), secret: 'super secret' })); 
    app.use(express.errorHandler()); 
}); 

// Routes 
require('./routing.js'); 

mongooseAuth.helpExpress(app); 

app.listen(3000); 
console.log('Express server listening on port %d in %s mode', app.address().port, app.settings.env); 

userModel.js

var Schema = mongoose.Schema; 
var mongooseTypes = require("mongoose-types"); 
var mongooseAuth = require('mongoose-auth'); 
mongooseTypes.loadTypes(mongoose); 

var everyauth = require('everyauth') 
everyauth.debug = true; 

var UserSchema = new Schema({any: {}}); 

UserSchema.plugin(mongooseAuth, { 
    everymodule: { 
     everyauth: { 
      User: function() { 
      return User; 
      } 
     } 
    } 
    , password: { 
     loginWith: 'email' 
     , extraParams: { 
      phone: String 
      , username: String 
     } 
     , everyauth: { 
      getLoginPath: '/login' 
      , postLoginPath: '/login' 
      , loginView: 'account/login.jade' 
      , getRegisterPath: '/register' 
      , postRegisterPath: '/register' 
      , registerView: 'account/register.jade' 
      , loginSuccessRedirect: '/login/success' 
      , registerSuccessRedirect: '/register/success' 
     } 
    } 
}); 

mongoose.model('User', UserSchema); 
User = mongoose.model('User'); 

Tại thời điểm này trong thời gian tôi thực sự chỉ cố gắng để sử dụng MongoDb làm cửa hàng phiên, nhưng một lần nữa tôi nhận được lỗi 500 không có thông tin nào trong node.js conso khi tôi cố gắng tải trang đăng nhập.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn

+0

Thực ra tôi chỉ thử lại với Express-session-mongo và mặc dù tôi vẫn nhận được hành vi tương tự (cố gắng tải trang đăng nhập không thành công với lỗi 500), tôi vừa kiểm tra trong MongoDb và phiên thực sự là ở đó như mong đợi. – Lancelot

+0

FYI, cũng đã thử kết nối-mongo, cùng một kết quả ... mongoose-auth không chơi đẹp? – Lancelot

+0

Sau khi đào sâu vào mã của mô-đun everyauth, tất cả những gì tôi có thể tìm ra là lỗi 500 xảy ra trong dòng everyauth/lib/modules/password.js >> 47: res.render (xem, địa phương); Thật không may là không giúp ích gì nhiều cho vị trí của tôi ... :( – Lancelot

Trả lời

8

Nó kết thúc là một vấn đề các module khác nhau: kết nối-phiên Mongo/bày tỏ-phiên Mongo/kết nối-Mông Cổ, sử dụng kết nối 2.0.1 và Express sử dụng kết nối 1.8.5.

Dường như xung đột phụ thuộc ở đây ngăn chặn các mô-đun lưu trữ phiên truy cập thuộc tính 'req.secret'.

Để hoạt động, tôi đã kết thúc bằng mô-đun kết nối-mongodb vẫn đang sử dụng kết nối 1.8.5, giống như Express.

Lý do tôi không thể tạo kết nối-mongodb hoạt động trước khi là lỗi người dùng, tôi đã cố gắng quá nhiều để sao chép/dán từ các ví dụ trực tuyến thay vì đầu của tôi.

Đây là mã cấu hình mà kết thúc làm việc cho tôi với connect-MongoDB:

var Session = require('connect-mongodb'); 

app.configure('production', function(){ 
    var oneWeek = 657450000; 
    app.use(express.static(__dirname + '/../public', { maxAge: oneWeek })); 

    var session = express.session({ 
     store: new Session({ 
       url: 'mongodb://localhost:27017/test', 
       maxAge: 300000 
     }), 
     secret: 'superTopSecret' 
    }); 
    app.use(session); 

    app.use(mongooseAuth.middleware()); 
    app.use(require('./mySite').middleware()); 
    app.use(express.methodOverride()); 
    app.use(express.errorHandler()); 
}); 

Hope this helps bất kỳ ai khác chạy vào vấn đề này. Nếu bạn có bất kỳ đề nghị/cải tiến về giải pháp này, tôi rất vui khi nghe nó. :)

+3

Cảm ơn vì điều này đã giúp tôi. Tôi cũng có thể sử dụng kết nối hiện có của Mongoose thay vì chỉ định URL. nhiều môi trường với các cá thể DB riêng biệt, chỉ cần thay thế tham số 'url' bằng:' db: mongoose.connection.db' – k00k

+0

Tôi chỉ muốn nói, bạn thật tuyệt. – Lazy

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