2

の 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-sessionconnect-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 !彼の答えに賛成してください!

4

1 に答える 1

4

セッション オブジェクトをプレーン テキストとして保存しています。そのため、オブジェクトとして検索できません。

「父」コレクションのスキーマに、次のようなタイプ「{}」(オブジェクト) としてセッション フィールドがあることを確認します。

うまくいかない場合は、次の方法を試すことができます。

セッション オブジェクトをプレーン テキストとしてではなくオブジェクトとして保存する方法を変更できます。

または、次のようにセッション フィールドでsidを見つけようとして、正規表現でセッションを検索できます。

db.user.findOne({session: /.*f59106e845e11df8c3413b5f1f80ee01e876526bc3c0d05.*/});
于 2015-06-12T19:17:32.063 に答える