6

ノードに基本的なセッションシステムをセットアップしようとしています。これが私がこれまでに得たものです:

app.js:

app.use(express.cookieParser('stackoverflow'));
app.use(express.session());

私はajax.jsでセッションデータを設定しています:

addClassToCart: function(req, res) {
  req.session.cart = req.body.classId;
  console.log(req.session.cart);
}

これにより、正しい情報がログに記録されます。ただし、その情報を他の場所(同じファイル、異なる関数)で取得しようとすると、次のようになります。

console.log(req.session.cart);

取得しundefinedます。信じられないほど基本的なものが欠けているような気がします。このためのさまざまなチュートリアルはひどいものであるか、さらに多くのパッケージを追加する必要があります(私が避けようとしていること)。

私のデバッグからのより多くのデータ:

  • これはAJAX以外のリクエストで機能します
  • セッションは、ログに記録される前に設定されます。
4

4 に答える 4

6

結局のところ、問題はExpressのセッションではありませんでした(他の回答が考えているようです)。むしろ、それは私の側の誤解でした。私は次のように変更addClassToCartしました:

addClassToCart: function(req, res) {
    req.session.cart = req.body.classId;
    console.log(req.session.cart);
    res.send('class added');
  }

追加res.send()すると問題が修正されました。

于 2012-11-17T19:27:13.130 に答える
2

関連するSOの質問への回答に記載されているように、これは、フェッチcredentialsを使用してサーバーからデータを取得しているが、オプションを渡さない場合にも発生する可能性があります。

fetch('/addclasstocart', {
    method: 'POST',
    credentials: 'same-origin' // <- this is mandatory to deal with cookies
})

このオプションを含めない限り、Cookieはサーバーに渡されません。これは、リクエストのセッションオブジェクトが新しい呼び出しごとにリセットされることを意味します。

于 2017-01-24T16:59:46.497 に答える
-1

基本的なセッションストアについてはわかりませんが、redisのセットアップには数分しかかかりませんでした。

  app.use(express.session({
    store: new RedisStore({
      host: cfg.redis.host,
      db: cfg.redis.db
    }),
    secret: 'poopy pants'
  }));

Macの場合:

brew install redis
于 2012-11-17T02:03:57.327 に答える
-2
app.use(express.session({
  secret: "my secret",
  store: new RedisStore,
    cookie: { secure: false, maxAge:86400000 }
}));

問題がセッションの経過時間にあるかどうかはわかりませんが、念のため、maxAgeを指定することをお勧めします。

于 2012-11-17T19:23:59.137 に答える