tech.chakapoko.com
Home / Node.js / Express

[Node.js][Express]セッションを使う

セッションの使用

Expressでセッションを使うには express-session モジュールを使います。

$ npm install --save express-session

次のコードはセッションを使ってユーザーのアクセス数を表示します。ブラウザでアクセスするたびにカウントが増えていくことが確認できます。

const express = require('express');
const session = require('express-session');
const app = express();

const sess = {
  secret: 'secretsecretsecret',
  cookie: { maxAge: 60000 },
  resave: false,
  saveUninitialized: true,
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1)
  sess.cookie.secure = true
}

app.use(session(sess))

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
  } else {
    req.session.views = 1;
  }
  res.send('views : ' + req.session.views);
})

app.listen('3000', () => {
  console.log('Application started');
});

cookie.secure

cookie.secure を設定するとHTTPSでアクセスした時のみcookieを有効にします。本番環境では cookie.secure を設定するべきです。

saveUninitialized

saveUninitialized をtrueに設定すると regenerate メソッドなどで初期化されていないセッションも保存できます。

ログイン機能を実装したり、サーバー容量を削減したり、cookieを設定する前に許可が必要な場合などはfalseを設定します。

セッションストアを利用する

express-session を使った場合、サーバーサイドではセッションはメモリに保存されます。これはメモリを消費したり、サーバーを再起動するとデータが消えてしまったりと、本番運用には向いていません。

そこでsession storeと呼ばれるモジュールを使います。express-session には様々なストレージを使ったsession storeの実装があります。

ここではMySQLにセッションを保存する express-mysql-session を紹介します。

インストール

インストールからnpmから行えます。

$ npm install --save express-mysql-session

設定

セッションストアのインスタンスを作成し、store という設定項目を追加します。

データベースには sessions というテーブルが自動的に作成され、そこにセッションデータが保存されます。

次のコードは express-mysql-session を利用したサンプルです。サーバーを再起動してもセッションデータが消えず、カウントが増えていくことが確認できます。

const express = require('express');
const session = require('express-session');
const app = express();

const MySQLStore = require('express-mysql-session')(session);

const options = {
    host: 'localhost',
    port: 3306,
    user: 'me',
    password: 'my_password',
    database: 'my_database'
};

const sessionStore = new MySQLStore(options);

const sess = {
  secret: 'secretsecretsecret',
  cookie: { maxAge: 60000 },
  store: new MySQLStore(options),
  resave: false,
  saveUninitialized: true,
}

if (app.get('env') === 'production') {
  app.set('trust proxy', 1)
  sess.cookie.secure = true
}

app.use(session(sess))

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
  } else {
    req.session.views = 1;
  }
  res.send('views : ' + req.session.views);
})

app.listen('3000', () => {
  console.log('Application started');
});