connect-sqlite3 でsessionストア
注意
相当イケてないですが、本記事は Connect2.* 系な書き方になっております。
(つまり、Express3.*系)
npm install connect@2.23.0 --save # 2014/07/22時点の、connect2系最新
環境
準備
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)
- 作者: Mike Cantelon,Marc Harter,T.J. Holowaychuk,Nathan Rajlich,生越昌己,吉川邦夫
- 出版社/メーカー: 翔泳社
- 発売日: 2014/06/10
- メディア: 大型本
- この商品を含むブログを見る