4

私の問題を説明する次のテストコードを書きました:

var express     = require("express"),
    MongoStore  = require("connect-mongo")(express),
    mongoose    = require("mongoose"),
    config      = require(process.cwd() + "/src/config");

exports.run = function() {
    console.info("running http server");

    //create a new HTTP server
    var server = express();

    //sessions
    server.use(express.cookieParser(config.sessions.secret));
    server.use(express.session({
        secret: config.sessions.secret,
        key: config.sessions.key,
        proxy: true,
        cookie: {maxAge: config.sessions.maxAge, signed: true},
        store: new MongoStore({
            mongoose_connection: mongoose.connection
        }, onStoreSetup)}));

    //create a test ObjectID parameter
    var testObjId = new mongoose.Types.ObjectId("522bb0205a259c636c000006");
    server.get("/", function(req, res) {
        if (req.session && req.session.testObjId) {
            res.send("req.session.testObjId now has type " + typeof req.session.testObjId + " - WHY A STRING?");
        }
        else {
            req.session.testObjId = testObjId;
            req.session.save(function(err) {
                if (err) throw err;
                res.send("req.session.testObjId has type " + typeof req.session.testObjId + " - an Object, as expected - NOW REFRESH THIS PAGE");
            });
        }
    });

    //listen for incoming connections once session store is setup
    function onStoreSetup() {
        console.info("mongo session store connected");

        server.listen(config.http.port);
        console.info("http server listening on port %d", config.http.port);
    }
};

まず、(MongoDB ネイティブからの) ObjectId 型の変数をサーバー側のセッション ストアに書き込みます。次にページを更新すると、セッションが使用され、パラメーターの型が突然文字列に変更されます。

つまり、上記のコードを実行すると、次のように表示されます。

  1. 訪問/

    応答:req.session.testObjId has type object - NOW REFRESH THIS PAGE

  2. 再訪/_

    応答:req.session.testObjId now has type string - WHY A STRING?

なぜ文字列に変換されたのですか?

4

1 に答える 1