の MongoDB 経由で sessionStore を設定する際に、ユーザーの情報が有効で最新のものであることを確認する機能をexpress-session
使用するのに少し問題があります。findOne()
var session = require('express-session');
var mongoStore = require('connect-mongo')(session);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Session = mongoose.model('session', new Schema({
sid : String,
username : String,
email : String
}));
...
ただし、秘訣は、データベースへの書き込みexpress-session
をconnect-mongo
管理する責任があることです。
app.use(session({
secret: 'secretsquirrel',
resave: true,
saveUninitialized: true,
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName'
})
}));
ドキュメントが指定したコレクションに入力されるため、これは正常に機能しているように見えます。コレクションからデータを返すと、次の結果が得られます。
{
"_id":"sdBYsdflAsdfyWPPneV-hrC2xsXP",
"session":"
{
\"cookie\":
{
\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"
},
\"email\":\"testuser@email.com\",
\"username\":\"testuser\",
\"sid\":\"f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05\",
}",
"expires": ISODate(DateHere)
}
問題がデータベース内または Mongoose 経由であると思われる場合、SID のクエリをどのように試行しても問題ないように思われます。次のいずれかを使用しても結果が返されません。
モンゴ経由:
db.collectionName.findOne({ session.sid: "sid" })
db.collectionName.findOne({ "session.sid": "sid" })
db.collectionName.findOne({ "session": { "\"sid\"": "sid" } })
Mongoose 経由 (NodeJS)
Session.findOne({ sid: req.session.sid }, function(err, data) {...});
Session.findOne({ "sid": req.session.sid }, function(err, data) {...});
Session.findOne({ "\"sid"\"": "\"" + req.session.sid + "\"" }, function(err, data) {...});
問題は、両方のインスタンスで、コレクション内にあることを確認したデータを返すことができないのはどうしてですか? 私がやろうとしていたように、ドキュメントで返されたエスケープされた引用符を考慮する必要がありますか、それとも mongo シェルを介して単に出力されますか?
このデータを正しく検索するために不足している手順はありますか? 新鮮な目のセットをいただければ幸いです。
解決:
vinagretiは、私のコレクションに保存されているデータはオブジェクトではなく、プレーンテキストであると指摘しました。
connect-mongo のドキュメントを参照すると、 には追加のオプションがありますstringify
。この設定は、セッションからデータベースに保存されたデータを文字列化してシリアル化します。express-session
がすでに JSON オブジェクトを生成していることを考慮すると、 を使用stringify()
すると、コレクション内で検索できなくなります。
stringify: false
必要なのは、次のように mongoStore 設定に追加することだけでした。
store: new mongoStore({
mongoseConnection: mongoose.connection,
host: '127.0.0.1',
port: '27017',
db: 'testdb',
collection: 'collectionName',
stringify: false
})
そして出来上がり!コレクションに保存されたものはすべてオブジェクトになり、検索可能になりました。問題を指摘してくれてありがとうvinagreti !彼の答えに賛成してください!