素晴らしく詰まったので、備忘録。
node.jsでsocket.ioをexpressと一緒に使いたい(というか非同期バンバンやりたいからnode.jsなので)
それで「node.js+socket.io」はまぁまぁ躓きながらも大丈夫そう。
で、問題は「node.js+express+socket.io」。
express3で(とりあえず)やってみましょうと思い、socket.ioを入れてみるが「/socket.io/socket.io.js not found 404 」
になる。
もう何してもなる。
WEBあさりしてもぜんぜんなる。
それっぽいのはスタックオーバーフローのサイトにでているんだけれども、どうやら違う?
最終的には下記の回答そのままやったら無事つながりました。
(原文)
Using with the Express 3 web framework: (from socket.io)
Express 3 requires that you instantiate a http.Server to attach socket.io to first:
meaning - (1) you must create a server instance:
var app = express();
var http = require('http').createServer(app);
(2) couple it with the socket.io:
var io = require('socket.io');
io.listen(http);
and ONLY THEN - (3) make the server listen:
http.listen(8080);
make sure you keep this order!
(以上原文)
(訳)
Express 3をつこうとるとして: (socket.ioからね)
Express 3 ではhttp.Server をsocket.ioに最初にかませるんじゃ
1サーバーインスタンスを作るんじゃ!
var app = express();
var http = require('http').createServer(app);
2socket.ioと紐づけるんじゃ!
var io = require('socket.io');
io.listen(http);
3あとはserverをlistenさせるだけじゃ!
http.listen(8080);
※順番は絶対守るんじゃぞ!
(以上和訳)
何でそんなに詰まっていたかというと、ポイントとして
・express3ではhttpモジュールからcreateServerしてそいつをio.listenさせないといけない。
(expressのインスタンスをio.listenさせても動かない)
という点がはまりポイントだったんですね。
…でそのはまりポイントばかりに目がいって、「う。うごかない。。。。。汗」的な。
で、どうしたかというと、上記回答の「3」
http.listen(8080);
これね。
※cloud9では一応、
http.listen(process.env.PORT);
的な感じ。
expressのインスタンスをlistenするんじゃなくてhttpモジュルのほうをlistenさせるのね。
ほうほう。
ずっと
app.listen(8080);
ってやってたわ。
app.listenしないと動かないと思い込んでたら違った。
もすこしexpressの基礎を理解しないとなぁ、と思ったり思わなかったり。
いじょうです。