在Express中使用MongoStore时出错

我试图将我的Express应用程序的会话存储在MongoStore中,但是在连接时出现错误。 该错误是一个巨大的对象/ JSON,我无法理解,所以我尝试了所有替代方法,我在网上find,但没有运气,迄今为止…

这里是应用程序configuration:

var express = require('express'), MongoStore = require('connect-mongo')(express), passport = require('passport'); var app = express(); app.configure(function(){ app.use(express.compress()); app.use(express.static(path.join(__dirname, 'public'))); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.set('port', process.env.PORT || 8000); app.use(express.favicon(__dirname + '/public/img/favicon.ico')); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.session({ secret: 'secret', store: new MongoStore({ db: dbOptions.db, host: dbOptions.host, port: dbOptions.port, username: dbOptions.username, password: dbOptions.password }, function(err){ console.log(err || 'connect-mongodb setup ok'); }) })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); }); app.configure('development', function(){ app.use(express.errorHandler()); }); 

这是在控制台中logging的错误:

 { db: { domain: null, _events: {}, _maxListeners: 10, databaseName: 'dbname', serverConfig: { domain: null, _events: {}, _maxListeners: 10, _callBackStore: [Object], _commandsStore: [Object], auth: [Object], _dbStore: [Object], host: 'ec2-xx-xxx-xxx-xx.eu-west-1.compute.amazonaws.com', port: 27017, options: [Object], internalMaster: true, connected: true, poolSize: 5, disableDriverBSONSizeCheck: false, _used: true, replicasetInstance: null, emitOpen: false, ssl: false, sslValidate: false, sslCA: null, sslCert: undefined, sslKey: undefined, sslPass: undefined, serverCapabilities: [Object], name: 'ec2-xx-xx-xxx-xx.eu-west-1.compute.amazonaws.com:27017', _readPreference: null, socketOptions: [Object], logger: [Object], eventHandlers: [Object], _serverState: 'connected', _state: [Object], recordQueryStats: false, socketTimeoutMS: [Getter/Setter], db: [Circular], dbInstances: [Object], connectionPool: [Object], isMasterDoc: [Object] }, options: { w: 1 }, _applicationClosed: false, slaveOk: false, bufferMaxEntries: -1, native_parser: undefined, bsonLib: { Code: [Function: Code], Symbol: [Function: Symbol], BSON: [Object], DBRef: [Function: DBRef], Binary: [Object], ObjectID: [Object], Long: [Object], Timestamp: [Object], Double: [Function: Double], MinKey: [Function: MinKey], MaxKey: [Function: MaxKey], promoteLongs: true }, bson: { promoteLongs: true }, bson_deserializer: { Code: [Function: Code], Symbol: [Function: Symbol], BSON: [Object], DBRef: [Function: DBRef], Binary: [Object], ObjectID: [Object], Long: [Object], Timestamp: [Object], Double: [Function: Double], MinKey: [Function: MinKey], MaxKey: [Function: MaxKey], promoteLongs: true }, bson_serializer: { Code: [Function: Code], Symbol: [Function: Symbol], BSON: [Object], DBRef: [Function: DBRef], Binary: [Object], ObjectID: [Object], Long: [Object], Timestamp: [Object], Double: [Function: Double], MinKey: [Function: MinKey], MaxKey: [Function: MaxKey], promoteLongs: true }, _state: 'connected', pkFactory: { [Function: ObjectID] index: 16051204, createPk: [Function: createPk], createFromTime: [Function: createFromTime], createFromHexString: [Function: createFromHexString] }, forceServerObjectId: false, safe: false, notReplied: {}, isInitializing: true, openCalled: true, commands: [], logger: { error: [Function], log: [Function], debug: [Function] }, tag: 1387402758191, eventHandlers: { error: [], parseError: [], poolReady: [], message: [], close: [] }, serializeFunctions: false, raw: false, recordQueryStats: false, retryMiliSeconds: 1000, numberOfRetries: 60, readPreference: undefined }, collectionName: 'sessions', internalHint: null, opts: {}, slaveOk: false, serializeFunctions: false, raw: false, readPreference: 'primary', pkFactory: { [Function: ObjectID] index: 16051204, createPk: [Function: createPk], createFromTime: [Function: createFromTime], createFromHexString: [Function: createFromHexString] }, serverCapabilities: undefined } 

这是非常隐晦的,所以我不知道我应该search哪个方向。

编辑1:

好的感谢,现在更有意义,但事情是我试图logging一个错误,因为会议不存储在MongoDB中,我不明白为什么。 我在MongoStore的设置中添加了一个try catch块,以查看是否触发了一个错误,并且没有,所以我不知道为什么它不工作…

这是passportjs如何存储和检索会话:

 passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(_id, done) { var userProvider = new UserProvider(); userProvider.findUser({ _id: _id }, function (err, users) { if(users.length > 0) { done(null, users[0]); } else { done(err, null); } }); }); 

我错过了什么?

谢谢你的帮助!

你的问题是在以下行:

 store: new MongoStore({ db: dbOptions.db, host: dbOptions.host, port: dbOptions.port, username: dbOptions.username, password: dbOptions.password }, function(err){ console.log(err || 'connect-mongodb setup ok'); }) 

只需删除最后一个function,我相信它应该像你最初预期的那样工作

与Andrei的答案相反,MongoStore构造函数确实接受callback。 然而,这不是出于error handling的目的 – 它实际上传回了MongoStore的集合属性(这就是为什么console.log将它发出)。 如果出现错误,MongoStore将会抛出一个错误。 你可以点击这里在源代码中find它。 该callback在第164行被调用。