自習室

こもります

connect-sqlite3 でsessionストア

注意

相当イケてないですが、本記事は Connect2.* 系な書き方になっております。

(つまり、Express3.*系)

npm install connect@2.23.0 --save  # 2014/07/22時点の、connect2系最新

環境

  • Ubuntu 12.04 LTS 32bit on Vagrant (virtual box)
  • Node 0.10.29 on nodebrew
  • connect@2.23.00

準備

connect-sqlite3 のインストール

npm install connect-sqlite3 --save

(後で使います)コマンドラインツールを入れておく

sudo apt-get install sqlite3

ソースコード

// server.js
var connect = require('connect');
var sqlite3Store = require('connect-sqlite3')(connect);

var sessionOption = {
  store: new sqlite3Store({db: "./hoge.sqlite3"}),  // db名を指定。これでアプリ直下にhoge.sqlite3 というsqlite3データベースファイルが作成されます
  secret: 'izmiz',              // cookieを符号化しているキー
  key: 'izmizsid',              // cookieにsessionを記入している変数名
  cookie: { maxAge: 60 * 1000 }  // 1分で無効になるsession
};

var app = connect()
  // .use(connect.cookieParser('izmiz'))   // はじめ必要かと思いましたが不要でした。
  .use(connect.session(sessionOption))     //sessionOptionの設定内容でsession管理をします!
  .use(function( req, res, next) {
    var sess = req.session;
    console.log(sess);      // 試しにどんな物が含まれて居るのかサーバ側で確認
    if(sess.views) {
      sess.views++;           // sessionの独自のデータを変更する(1)
      sess.cart.push('hoge'); // sessionの独自のデータを変更する(2)

      res.setHeader( 'Content-Type', 'text/html' );     // 画面表示
      res.write('<p> views : ' + sess.views + '</p>');  // 画面表示
      res.write(JSON.stringify(sess.cart, null, '  ')); // 画面表示
      res.end();                                        // 画面表示
    } else {
      sess.views = 1;        // sessionに独自のデータを保存しておく(1)
      sess.cart = ['hoge'];  // sessionに独自のデータを保存しておく(2)
      res.end('welcome to the session demo: the 1st time. please refresh');
    }
  });

app.listen(3000);

connect-sqlite3 オブジェクト作成時のオプション

公式にもほとんど情報載ってませんが…

rawberg/connect-sqlite3 · GitHub

var sessionOption = {
  store: new sqliteStoroe({
    table: 'sessions',  // sessionのデータを残すテーブル名 無指定だと"sessions"
    db: 'sessions.db',  // 上記テーブルが書き込まれるdb名  無指定だと"sessions.db"
    dir: '.'            // 上記dbファイルが作られるディレクトリ 無指定だと'.'
  }),
  secret: //...以下略

挙動確認

サーバの出力

アクセスするごとに

  • views がインクリメント
  • cart に "hoge"が追加
  • sessionのexpireタイムが更新される

のが分かると思います

vagrant@precise32:~/Node.js/session$ node server.js
{ cookie:
   { path: '/',
     _expires: Tue Jul 22 2014 06:11:36 GMT+0000 (UTC),
     originalMaxAge: 59999,
     httpOnly: true },
  views: 4,
  cart: [ 'hoge', 'hoge', 'hoge', 'hoge' ] }
{ cookie:
   { path: '/',
     _expires: Tue Jul 22 2014 06:11:39 GMT+0000 (UTC),
     originalMaxAge: 59999,
     httpOnly: true },
  views: 5,
  cart: [ 'hoge', 'hoge', 'hoge', 'hoge', 'hoge' ] }
{ cookie:
   { path: '/',
     _expires: Tue Jul 22 2014 06:11:43 GMT+0000 (UTC),
     originalMaxAge: 59999,
     httpOnly: true },
  views: 6,
  cart: [ 'hoge', 'hoge', 'hoge', 'hoge', 'hoge', 'hoge' ] }

node のアプリを止めて、sessionデータの永続化を確認

ちゃんとデータベースに書き込まれているので、一度 nodeのプロセスを止めて、再起動しても、ちゃんとこのデータが復活するのが確認出来ます(1分でsessionがエクスパイアするので、その間に再起動して!)

データベースの中身を見てみる

アプリ直下に hoge.sqlite3 というファイルを作ってデータベースとする設定にしているので以下のような感じでコマンドライン上から覗いてみる

vagrant@precise32:~/Node.js/session$ sqlite3 hoge.sqlite3.db
SQLite version 3.7.9 2011-11-01 00:52:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables # セッションに関するデータが収められるtableを確認
sessions
sqlite> select * from sessions; # 保存されているセッションデータを確認
y18WVhTiNJs7Gi4gHsXrQjbtqjeY3fL4|1406009506612.0|{"cookie":{"originalMaxAge":59999,"expires":"2014-07-22T06:11:46.612Z","httpOnly":true,"path":"/"},"views":10,"cart":["hoge","hoge","hoge","hoge","hoge","hoge","hoge","hoge","hoge","hoge"]}
sqlite>

データベースの中身を消してみる

sqlite> delete from sessions;
sqlite> select * from sessions;
sqlite>

セッションのテーブルからすべてのデータを消しました。セッションのデータをサーバから消した状態なので、当然ですが、この後ブラウザから再度 127.0.0.1:3000 にアクセスすると、過去のviews等の値がリセットされています。

メモ

参考にした本

実践Node.js プログラミング (Programmer's SELECTION)

実践Node.js プログラミング (Programmer's SELECTION)