読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Node.js で session を使う

今回はNodeでのセッション管理機能の使い方です。 Expressフレームワークを使用する前提です。 まず最初にデフォルトのMemoryStoreセッションストアを使用します。しかしこれはメモリリークなどの不具合があるため、後半ではMongoDBやMemcachedなどのセッションストアを使った使用方法を解説します。 ◆デフォルトのMemoryStoreセションストア app.jsにcookieParsersessionミドルウェア登録します。 app.use(express.cookieParser("hogehoge")); app.use(express.session({secret: 'fugafuga'})); express.cookieParserの引数は署名付きCookieを生成するための秘密文字列(パスフレーズです。任意。 express.sessionの引数secretはハッシュ化のための値です。これも任意。 あと注意として app.use(app.router); より前に記述する必要があります。以下の感じです。
app.configure(function() {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.cookieParser("hogehoge"));
    app.use(express.session({secret: 'fugafuga'}));
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));
});
◆使ってみる routesの方で扱ってみます。 routes/index.js
exports.index = function(req, res){
    if (req.session) {
        console.log(req.session);
    }
    req.session.user = {
        user: "hayo",
        pass: "fuga"
    };
    res.render('index', { title: 'Express' });
};
初回アクセスでは何も保存されてないため
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }
と表示されますが、二回目以降は値を保持してます。
{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
   user: { user: 'hayo', pass: 'fuga' } }
こんな感じでログイン情報を保持するのに簡単なセッション管理の仕組みができました。 ちなみにログアウトなどでセッション情報を削除するときは delete req.session.user; とオブジェクトを指定して削除したり、全部消したいときは req.session.destroy(callback); とすればOKです。 DBに保存する場合は req.session.save(callback); とします。 ◆MongoDBセッションストアを使う 先ほどとあまり変わりません。まず予めnpmでモジュールをインストールしておき、requireでインスタンスを作成します。今回はMongoDBっを使用するセッションストアなのでconnect-mongodbというものを使用します。 $ npm install connect-mongodb app.jsで
var MongoStore = require('connect-mongodb')(express);

app.use(express.cookieParser("hogehoge"));
app.use(express.session({
    key: 'sid',
    cookie: {},
    store: new MongoStore({
        db: 'databaseName', // require
        host: 'databaseHost', // default: 127.0.0.1
        username: 'username', // optional
        password: 'password', // optional
        clear_interval: 60 * 60 // Interval in seconds to clear expired sessions. 60 * 60 = 1 hour
    })
}))
デフォルトのセッションストア以外を使う場合は、express.sessionにstoreを指定します。 またDBを使う場合インスタンスの引数にDB情報を入れておきます。 セッション管理方法はデフォルトのセッションストアと同じです。 Memcachedセッションストアを使う DBの構築なんかしてないし、面倒だなぁという人にはmemcachedが向いてます。メモリ上にデータを保存するので再起動すればデータは消えてしまいますが、お手軽に試すことができます。 $ npm install connect-memcached app.js
var MemcachedStore = require('connect-memcached')(express);

app.use(express.cookieParser("hogehoge"));
app.use(express.session({
    secret: 'fugafuga',
    key: 'sid',
    cookie: {},
    store: new memcachedStore()
}));
こちらは特にDB情報必要ないです。 ソース: 【express】sessionで値の受け渡し【node.js】 Node.js + Express + MongoDB でのセッション管理 session secret? what is it connect-redisでセッション管理