express.ioの導入

紹介までしといてまだセットアップもしてなかったのかよっていうツッコミはおいといて。

簡単に紹介し直すと、Node.jsのアプリの定番フレームワークとしてExpressがあり、またWebSocketを主に使った双方向通信ができるのがSocket.IOで、
この2つを合わせて使うのに便利なフレームワークexpress.ioです。

で、セットアップで微妙にハマったので、備忘録。といっても1時間弱くらいだから全然大したことないんですがね。

Expressをexpress.ioに置き換えるのは超簡単だよ、と公式にあったので、とりあえずまずExpressのひな形を作成してそれを変更するという手順でやったのですが、最初うまくいかず。
ちゃんとexpress.ioの公式に書いてある書き方にぼちぼち直したら動きました。

手順

今回はasdfprojectという名前にします。

$ npm install -g express
$ express asdfproject -s # -sはセッションを使うときのオプション
# asdfprojectフォルダが作成され、その下にExpressを使い始めるのに必要なファイルが一通りそろっている
$ cd asdfproject

package.jsonを編集。expressをexpress.ioに変えるだけ。

{
  // 前略
  "dependencies": {
    // この行を変更 => "express": "3.4.8",
    "express.io": "*",
    "jade": "*"
  }
}
$ npm install

これでexpress.ioが無事に入ればOK。

app.jsがこんな感じで生成されているはず(express 3.4.8を使用している)

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express().http().io();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

app.jsを編集していきます。

// 前略

// まずはここ
// var express = require('express');
var express = require('express.io');

//中略

// express.ioの機能を使うため、以下を変更。メソッドチェーンしてる
// var app = express();
var app = express().http().io();

// 中略

// ここでハマった。express.ioの公式の言う通りにすること。
// それぞれのミドルウェアについて全然調べていないが、とりあえず…
// app.use(express.cookieParser('your secret here'));
// app.use(express.session());
app.use(express.cookieParser());
app.use(express.session({ secret: 'your secret here' })); // 単に文字列のままだとエラーになった

// 中略

// http.createServerする必要ない。app.http()に含まれてるのかな。
// 良く分からない。Expressのドキュメント色々信用できない。そもそも作成されるひな形が悪いのかも。

// http.createServer(app).listen(app.get('port'), function(){
app.listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

// app.io.routeでsocket.ioのイベントをハンドルする
# 実行
$ node app.js

socket.ioをセットアップすると、クライアントからは
http://localhost:3000/socket.io/socket.io.js
にアクセスすることができるようになる。これが404の場合、なんか設定間違ってる。(最後のhttp.createServer(app)の記述のままだと、404になった。)
あと、session関係の記述もミスると、TypeError: secret required とか出て落ちる。

結論

expressのひな形から作り始めるのはおすすめしない。
自分で調べてミドルウェア追加していったほうがハマりが少なそう・・・