私の問題を説明する次のテストコードを書きました:
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 型の変数をサーバー側のセッション ストアに書き込みます。次にページを更新すると、セッションが使用され、パラメーターの型が突然文字列に変更されます。
つまり、上記のコードを実行すると、次のように表示されます。
訪問
/
応答:
req.session.testObjId has type object - NOW REFRESH THIS PAGE
再訪
/
_応答:
req.session.testObjId now has type string - WHY A STRING?
なぜ文字列に変換されたのですか?