セッションの使用
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');
});