6

次のようにオブジェクトをセッションに保存すると:

user.name = "Kelvin"; // user is an object pass by "mongoose" findOne's callback.
req.session.user = user; 
console.log(req.session.user.name); // Kelvin

その後、他の高速ルートで「ユーザー」にアクセスします。

app.get("/somepath", function(req, resp) {
    console.log(req.session.user.name); // undefined
});

設定した関数以外に req.session.user.name が定義されていない理由を知りたいですか?

4

1 に答える 1

17

マングースのソースコードを調べたところ、これはマングースのモデルとセッションがどのように機能するかによるものと言えます。req.session.user = user次に呼び出すreq.session.userと、オブジェクトを指しますが、実際にはデータをどこかに保存する必要があります(メモリやRedisなど)。

これを行うために、Expressの呼び出しJSON.stringify(sess)と文字列がメモリに保存されます。ここからマングースが入ります。モデルは、それらを文字列化すると、スキーマで事前定義された属性のみが含まれるように構築されます。したがって、req.session.user = userExpressを設定すると、文字列化されusername属性が失われ)、データが保存されます。別のルートを呼び出すとreq.session.user、Expressは文字列化されたデータを解析し、属性のないオブジェクトを取得しnameます。

これを修正する方法は?いくつかの方法があります。

  • nameスキーマに属性を追加します。
  • ユーザーの新しいリテラルオブジェクトを定義します。

    var newuser = { id: user.id, name : "Kelvin", pwd: user.pwd, etc. }; req.session.user = newuser;

  • 別のフィールドに名前をreq.session.name = "Kelvin";保存する:(最良の解決策imho)

ちなみに、セッション中にユーザーオブジェクトを保持するべきではありません。管理者などの他のユーザーがユーザーオブジェクトに変更を加えた場合はどうなりますか?それらはまったく表示されません。セッションでユーザーのIDのみを保持し、カスタムミドルウェアを作成してDBからユーザーをロードし、requestオブジェクトに保存することをお勧めします。

于 2012-04-22T09:14:49.663 に答える