2013-12-18 13 views
1

MongoStore에 Express 앱 세션을 저장하려고하는데 연결시 오류가 발생합니다. 이 오류는 내가 이해 할 수없는 큰 객체/JSON, 그래서 나는 온라인으로 발견 된 모든 대안하지만 지금까지 운이 ... 여기 Express와 함께 MongoStore를 사용하는 중 오류가 발생했습니다.

는 응용 프로그램 구성입니다 시도 :

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

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

그것은 그래서 내가 검색해야하는 방향으로 아무 생각이 꽤 모호한입니다 : 그리고 이것은 콘솔에 기록되는 오류입니다.

편집 1 : 더욱 의미가 있지만, 일이 세션은 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); } 
    }); 
}); 

내가 무엇이 누락 되었습니까?

도움 주셔서 감사합니다.

답변

1

귀하의 문제는 다음 줄에 있습니다

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

단순히 마지막 기능을 제거하고 난 당신이 처음이 안드레이의 대답과는 달리

를 예상대로 작동합니다 믿는다 MongoStore 생성자는을 받아 않는다 콜백. 그러나 오류 처리 목적으로 사용되는 것은 아닙니다. 실제로 MongoStore의 콜렉션 특성을 되돌려줍니다 (console.log에서 수행 한 결과를 분출 한 이유입니다). 오류가 발생하면 MongoStore는 오류를 던집니다. 소스 코드 by clicking here에서 찾을 수 있습니다. 콜백은 164 행에서 호출됩니다.

+0

MongoStore에는 콜백이 있습니다. 생성자는 2의 값을 가지며 두 번째 인수는 실제로 콜백입니다. 그러나 노드 표준과 달리 콜백의 첫 번째 인수는 MongoStore의 컬렉션 속성이 아니라 오류가 아닙니다. – srquinn

+0

당신이 맞습니다, 그것은 세션이 아니라 상점의 콜백입니다. –

+1

콜백 라인을 놓쳤습니다 ... 코드를 한 단계 더 따르십시오. 전화는 164 번에 있습니다. https://github.com/kcbanner/connect-mongo/blob/master/lib/connect-mongo.js#L164 – srquinn

관련 문제