1

Express アプリのセッションを MongoStore に保存しようとしていますが、接続時にエラーが発生します。エラーは私が理解できなかった巨大な Object/JSON であるため、オンラインで見つけたすべての代替手段を試しましたが、これまでのところ運がありません...

アプリの構成は次のとおりです。

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

私は何が欠けていますか?

ご協力いただきありがとうございます!

4

1 に答える 1

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

最後の関数を削除するだけで、当初の期待どおりに機能するはずです

そこでの Andrei の回答に反して、MongoStore コンストラクターはコールバックを受け入れます。ただし、これはエラー処理の目的ではありません。実際には、MongoStore のコレクション プロパティを返します (これが、console.log が何をしたかを吐き出した理由です)。エラーが発生した場合、MongoStore は単純にエラーをスローします。ここをクリックすると、ソースコードで見つけることができます。コールバックは 164 行目で呼び出されます。

于 2013-12-18T23:01:33.127 に答える