node.js + expressでsessionを使う

June 20, 2012,
tags: express nodejs


このエントリーをはてなブックマークに追加

最近、また書き始めたnode.js。
前回より早く学習できている気がします。というか前回は自分が今まで作ってたwebプログラムの意識で学習していたので変な固定概念にとらわれていたのかと思います。。。

んで、今日はnode+expressでsessionを扱おうと思っていたんですが、普通にリクエストオブジェクトのsessionプロパティ触ったら500エラーになりました。。。
環境は以下の通り

  • node v0.6.18
  • express 2.5.10

コードは以下の通り
app.js

/**
 * Module dependencies.
 */

var express = require('express'),
   ,routes  = require('./routes');

var app = module.exports = express.createServer();

// Configuration


app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', routes.index);

routes/index.js

exports.signup = function(req,res){
  req.session.polidog = "いけめん";
}

って書いてあげて、実行してみたら500エラーが…

TypeError: Cannot set property 'polidog' of undefined

多分セッション系のライブラリを用意しなければとおもい、app.jsを修正

// Configuration


app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
  app.use(express.session({secret:"hogehoge"}));
});

まだエラーはでます。。

500 TypeError: Cannot read property 'connect.sid' of undefined

うーむ。。とおもったら、cookieParserも必要らしい…

// Configuration


app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.static(__dirname + '/public'));

  app.use(app.router);

  app.use(express.cookieParser());
  app.use(express.session({secret:"hogehoge"}));
});

それでもどうやらエラーが。。。。

もうどうしていいかわからない(´・ω・`)

適当にいじってたらどうやらapp.routerの記述の位置がだめみたい。下に変えてみたらなおったwww
結局cookieParser→session→app.routerの順番で記述すればいいみたい。
あ、そうそうサンプルでよく「 app.use(express.session());」って書いてあるサンプル多かったですが、僕のバージョンだと「 app.use(express.session({secret:”hogehoge”}));」と書かないとだめですね。

最終的なapp.js

// Configuration


app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());

  app.use(express.static(__dirname + '/public'));

  app.use(express.cookieParser());
  app.use(express.session({secret:"hogehoge"}));
  app.use(app.router);
});

comments powered by Disqus