2018-10-27に更新

Expressのセッションにファイルを使う

Expressでアプリケーションを作る場合、express-sessionを使うことで簡単にセッションを利用できます。ただ、これはインメモリのセッションのため、サーバーを再起動するとセッションが消えてしまいます。そのため、ファイルのセッションを試してみました。

※ 引き続き検証中ですが状況によってうまくセッションが読み込めなかったりしています。

環境

  • Express 4.15
  • express-session 1.15

session-file-store

下記のライブラリを使いました。

valery-barysok/session-file-store: Session file store is a provision for storing session data in the session file

インストール

yarn add session-file-store

設定

元々あったセッションの設定を下記のようにsession-file-storeを使う形に変更します。

const session = require("express-session");
const FileStore = require("session-file-store")(session);

app.use(
  session({
    secret: "your secret",
    store: new FileStore({
      ttl: 30 * 86400
    }),
    expires: new Date(253402300000000),
    resave: true,
    saveUninitialized: false
  })
);

僕が試した時は、resaveを設定しないと(最初だけ?)セッションが保存されませんでした。(とはいえresaveはデフォルトtrueとマニュアルにも書かれていますが…謎です)

もしかすると有効期限など、他の設定と影響したりしても挙動が変わってくるかもしれません。

まとめ

Expressのプロジェクトでファイルに保存するセッションを試してみました。

実際はデータベースに保存したりする方が良いとは思います。でも一応mweibel/connect-session-sequelizeというパッケージはあったのですが、最新のSequelizeでは動作しないようでした。あまりそのあたりのパッケージは充実していないのでしょうか。

あとは速さを求めるならそのままインメモリのままでも良いのかもしれません。何かでデーモンが再起動してしまった時のことなどが気にはなりますが。

そういう面でもファイルは割とお手軽で良いと思います(まだがっつり動作確認はできていませんが)。不安な場合等はとりあえず開発環境だけセッションをファイルで保存するようにしておくと良いかもしれませんね。サーバーが再起動する度にログイン状態が消えたりするのは結構面倒ですし。


dala00

Crieitの開発者です。 主にLAMPで開発しているWebエンジニアです(在宅)。大体10年程。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel5, CakePHP3, JavaScript, RoR 趣味:Elixir, Phoenix, Node, Nuxt, Express, Vue等色々

Crieitはαバージョンで開発中です。進捗は公式Twitterアカウントをフォローして確認してください。 興味がある方は是非記事の投稿もお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
関連記事

コメント