NodeJS + Express + Mongo Session 存储
Posted
技术标签:
【中文标题】NodeJS + Express + Mongo Session 存储【英文标题】:NodeJS + Express + Mongo Session storage 【发布时间】:2012-03-20 11:11:53 【问题描述】:我目前正忙着在 MongoDb 中存储会话。
我尝试过 express-session-mongo 和 connect-mongodb,当我尝试加载登录页面时,它们都给了我相同的“500 内部服务器错误”。这让我认为可能在某个地方与 mongoose-auth 存在冲突。
无论如何,这是我的设置:
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');
此时我真的只是想将 MongoDb 用作会话存储,但是当我尝试加载登录页面时,在 node.js 控制台中再次出现 500 错误,没有任何信息。
任何帮助将不胜感激。
谢谢
【问题讨论】:
实际上我只是用 express-session-mongo 重试,虽然我仍然得到相同的行为(尝试加载登录页面失败并出现 500 错误),但我刚刚签入了 MongoDb 和会话实际上是按预期存在的。 仅供参考,也尝试过 connect-mongo,结果相同... mongoose-auth 玩得不好? 在深入研究了everyauth模块的代码后,我只能弄清楚everyauth/lib/modules/password.js中发生了500错误>>第47行: res.render(view , 当地人);不幸的是,从我的立场来看,这并没有太大帮助...... :( 【参考方案1】:const express = require('express')
const app = express()
const cookieParser = require('cookie-parser');
const session = require('express-session')
const mongoose = require('mongoose');
const MongoStore = require('connect-mongo')(session);
mongoose.connect('mongodb://localhost/my-database',
useMongoClient: true
);
mongoose.Promise = global.Promise;
const db = mongoose.connection
app.use(cookieParser());
app.use(session(
secret: 'my-secret',
resave: false,
saveUninitialized: true,
store: new MongoStore( mongooseConnection: db )
));
【讨论】:
虽然这可能会回答这个问题,但如果可能的话,您应该 edit 您的回答包括一个简短的解释如何这个代码块回答这个问题。这有助于提供上下文,并使您的答案对未来的读者更有用。【参考方案2】:最终成为各种模块的问题:connect-session-mongo / express-session-mongo / connect-mongo,使用 connect 2.0.1 和 Express 使用 connect 1.8.5。
显然,这里的依赖冲突阻止了会话存储模块访问“req.secret”属性。
为了让它工作,我结束了使用仍然使用连接 1.8.5 的模块 connect-mongodb,就像 Express 一样。
之前我无法使 connect-mongodb 工作的原因是用户错误,我太努力地使用在线示例中的复制/粘贴而不是我的头脑。
这是最终使用 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());
);
希望这对遇到此问题的其他人有所帮助。如果您对此解决方案有任何建议/改进,我很高兴听到。 :)
【讨论】:
谢谢你,帮助了我。我还能够使用 Mongoose 的现有连接而不是指定 URL。当您有多个具有单独数据库实例的环境时,这尤其好。只需将url
参数替换为:db: mongoose.connection.db
我只想说,你很棒。以上是关于NodeJS + Express + Mongo Session 存储的主要内容,如果未能解决你的问题,请参考以下文章
mongo-express远程代码执行(CVE-2019-10758)漏洞复现(msfvenom/wget,反弹shell)