web-dev-qa-db-ja.com

エクスプレスセッションでsaveUninitializedとresaveを使用する場合

私はMEANスタックの初心者です。 express-session github doc を読みましたが、私には不明なオプションがいくつかあります。これらのオプションは、saveUninitializedおよびresaveです。

誰でもで説明できますか?saveUninitializedresaveを使用する利点は何ですか?これらのオプションのブール値を変更します。

構文:-

app.use(session({
  resave: false,
  saveUninitialized: true,
}))
32
user7104874

セッションがグローバルに(すべてのリクエストに対して)有効になっていると仮定しましょう。

クライアントがHTTPリクエストを作成し、そのリクエストにセッションCookieが含まれていない場合、express-sessionによって新しいセッションが作成されます。新しいセッションを作成すると、いくつかのことが行われます。

  • 一意のセッションIDを生成する
  • そのセッションIDをセッションCookieに保存します(したがって、クライアントによって行われた後続のリクエストを識別できます)
  • req.sessionとして空のセッションオブジェクトを作成します
  • saveUninitializedの値に応じて、リクエストの最後に、セッションオブジェクトはセッションストア(通常は何らかのデータベース)に格納されます

リクエストの存続期間中にセッションオブジェクトが変更されない場合、リクエストの最後でsaveUninitializedfalseの場合、(変更されていないため、まだ空の)セッションオブジェクトセッションストアには保存されません。

この背後にある理由は、これにより、セッションストアに多くの空のセッションオブジェクトが格納されるのを防ぐことができるからです。保存するのに役立つものは何もないため、セッションはリクエストの最後で「忘れられて」しまいます。

これをいつ有効にしますか?たとえば、定期的な訪問者を識別できるようにする場合。このような訪問者は、一意のIDを含むセッションCookieを送信するため、認識できます。

resaveについて:これは、「タッチ」コマンドをサポートしないセッションストアに対して有効にする必要がある場合があります。これが行うことは、特定のセッションがまだアクティブであることをセッションストアに伝えることです。これは、一部のストアがしばらくするとアイドル(未使用)セッションを削除するために必要です。

セッションストアドライバーがtouchコマンドを実装しない場合は、resaveを有効にして、リクエスト中にセッションが変更されなかった場合でも、ストアで更新されるようにします(それによりアクティブにマークします)。 。

したがって、このオプションを有効にする必要があるかどうかは、使用しているセッションストアに完全に依存します。

84
robertklep

注意すべきことの1つは、saveUninitializedfalseに設定すると、セッションが変更されました。その振る舞いは暗示されるかもしれませんが、最初に documentation を読んでいたとき、私にははっきりしませんでした。

12
spencer.sm