Work Records

日々の作業記録です。当初はiPhone・androidアプリ作成ネタなど。最近はソフトウェアエンジニアリング全般から、趣味の話まで。

node.jsでsession管理 connect-mysql-session

node.jsでアプリを書いていて、
session管理しなきゃなあと。

こんなページがあった。
POPULARの%ってどうやって調べてんだろうか。redisとmongodb人気だ。
https://nodejsmodules.org/tags/sessions

そんな中、connect-mysql-sessionを使う事にしました。
mysqlがinstall済みだったから。ただそれだけ。
CarnegieLearning/connect-mysql-session · GitHub

ほとんどUsageの通りに書くだけでした。

var routes = require('./routes/main');
...

var express = require('express'),
    MySQLSessionStore = require('connect-mysql-session')(express);

var app = express.createServer();
app.use(express.cookieParser());
app.use(express.session({
    store: new MySQLSessionStore("dbname", "user", "password", {
        // options...
    }),
    secret: "keyboard cat"
}));
...
var loginCheck = function(req, res, next) {
  if(req.session.user) {
    next();
  } else {
    res.redirect('/login');
  }
};
...
app.get('/', loginCheck, routes.index);
...

app.get()にloginCheckを噛ませてあげれば、
sessionが切れている場合には、/loginにリダイレクトしてくれる感じになりました。


ちなみに、内部的には以下のSQLが実行されていました。

初回リクエスト時

# Sessionsテーブルが無いので作成
Executing: CREATE TABLE IF NOT EXISTS `Sessions` (`sid` VARCHAR(255) NOT NULL UNIQUE, `expires` INT, `json` TEXT, `id` INT NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`));
MySQL session store initialized.
# Session Id をinsert
Executing: SELECT * FROM `Sessions` WHERE `sid`='XXXXXXXXXXXXXXXXXXXXXXXX' LIMIT 1;
Executing: SELECT * FROM `Sessions` WHERE `sid`='YYYYYYYYYYYYYYYYYYYYYYYY' LIMIT 1;
Executing: INSERT INTO `Sessions` (`sid`,`id`,`createdAt`,`updatedAt`,`expires`,`json`) VALUES ('YYYYYYYYYYYYYYYYYYYYYYYY',NULL,'2013-10-17 03:42:01','2013-10-17 03:42:01',1382035321,'{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}');

セッション作成時(req.session.user = xxxxみたいな処理)

Executing: SELECT * FROM `Sessions` WHERE `sid`='YYYYYYYYYYYYYYYYYYYYYYYY' LIMIT 1;
Executing: SELECT * FROM `Sessions` WHERE `sid`='YYYYYYYYYYYYYYYYYYYYYYYY' LIMIT 1;
# user名が入れられてupdatedAtがのびる
Executing: UPDATE `Sessions` SET `sid`='YYYYYYYYYYYYYYYYYYYYYYYY',`expires`=1382035583,`json`='{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"user\":\"test4\"}',`id`=1,`createdAt`='2013-10-17 03:42:01',`updatedAt`='2013-10-17 03:46:23' WHERE `id`=1

次回接続時

Executing: SELECT * FROM `Sessions` WHERE `sid`='YYYYYYYYYYYYYYYYYYYYYYYY' LIMIT 1;
Executing: SELECT * FROM `Sessions` WHERE `sid`='YYYYYYYYYYYYYYYYYYYYYYYY' LIMIT 1;
# updatedAtが更新
Executing: UPDATE `Sessions` SET `sid`='YYYYYYYYYYYYYYYYYYYYYYYY',`expires`=1382035629,`json`='{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"user\":\"test4\"}',`id`=1,`createdAt`='2013-10-17 03:42:01',`updatedAt`='2013-10-17 03:47:09' WHERE `id`=1

という事で、ほとんど勝手にやってくれる。
SELECTが2回あるのがなぜか不明だったりしますが、ソース読む元気も無いので良しとする。


自作アプリ紹介コーナー
iTunes の App Store で配信中の iPhone、iPod touch、iPad 用 ときめきエキスプレスStation
f:id:kenjiszk:20130706222734p:plain


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

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