socket.ioを使いたいならapp.listen()じゃだめさ

やあ子供たち。express勉強しているか。おじさんは勉強始めたばかりのくせにすぐこんなふうに上から目線のタイトルをつけた記事を書いちゃうんだからな。気を付けてくれよ。
さて今日はapp.listen()を使ってしまうと、socket.ioが使えなくなるという恐ろしい事実を知ったので緊急メモを残すぞ。

const express =require("express");
const app = express();
app.listen(80,()=>{
  console.log("app listening.. ");

const socketio = require("socket.io");
const io = socketio(server);
// emit, on, いくらやっても、、→→使えない!
});

io.sockets.on('connection', function (socket) {
  socket.on("tak",data=>{

  });
});

はい、これでサーバは立ち上がるだろうが、これではsocket.ioが使えなくなるんだね。え?エラー?いやいや何も出ないよ。ただソケット通信ができなくなるんだよ。いくらemitしてonで受け取ろうとしてもなしの礫さ。そして何十分も棒に振ることになるんだね。恐ろしいね。
ではどうすればよいか?まあ落ち着け、そうだからってexpressじゃsocket.ioが使えないぜって話でもないんだ。。

それはね、つまりexpress とsocket.io とを組み合わせて使いたい場合はね、以下のようにすることらしいぞ。

const express =require("express");
const app = express();
const http = require("http");
const server = http.createServer(app);
server.listen( 80, "127.0.0.1", ()=>{
  console.log("app listening.. ");
});

const socketio = require("socket.io");
const io = socketio(server);
// emit, on, いくらやっても、、→→使える!

io.sockets.on('connection', function (socket) {
  socket.on("tak",data=>{

  });
});

はいはい何をしたかというと、app.listen()ではだめで server.listen()を使っていきましょうということらしい。こうすればね、app.useとかapp.getとか普通に使えるしexpress使えるよ、しかもsocket.ioもちゃんと通信できる。
はい、ではなぜなのか。なぜapp.listen()ではだめで server.listen()ならsocket.ioが使えるようになるのか。
このことは本家サイト(●こちら)でも紹介されているが詳細説明はない。
そしてここでも(●リンク)いろいろ頑張ってみた人がいたが、腑に落ちる説明が見当たらない。ここの書込みではこのことをtrapと呼んでいる人もいて(1年前だよそんなに最近なのにね!)この案件は本当にtrapなんだよね。
では今日はこのあたりで。チャオ!