質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1036閲覧

node.js+express+socket.ioにおけるwwwファイルの編集是非

udoP_

総合スコア6

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/02/15 13:50

編集2020/02/16 00:30

実現したいこと

node.js初心者です。
node.js+express+socket.ioを用いてチャットを作りたいです。
利用者が話題別に部屋を作れるようなものをイメージしています。

質問

お聞きしたいことは、2点1点あります。

######①socket.ioのnamespaceの使い方(自己解決!)

expressのルータのように、

io.of("/socket/:roomid").on("connection", function(){ //処理 }

のような形で切り分けができればスマートで良いかなと思ったのですが、
調べたところsocket.ioにルートパラメータを受け取る機能は見つけられませんでした。
どのようにすれば同等の処理が出来ますか?
あるいは、roomで切り分けるべきですか?

######②socket.ioの処理をwwwファイルに書くことの是非

expressのテンプレートを使用したときは、
wwwファイルにsocket.ioの処理を書かねばならないようなのですが、
わからないながらに、wwwファイルを書き換えるという行為に違和感があります。

現在、少しでもスマートにするために、処理を別のファイルに記述しています。

www

1/** 2 * Create HTTP server. 3 */ 4 5var server = http.createServer(app); 6var io = require('socket.io')(server); 7 8var mySocket = require("../mySocket") 9var ms = new mySocket(io) 10ms.listen()

mySocket

1var mySocket = function(io){ 2 this.io = io 3} 4 5mySocket.prototype.listen = function(){ 6 this.io.connection(function(socket){ 7 //処理 8 }) 9} 10 11module.exports = mySocket

ところがこれも、ioオブジェクトを渡すのはなんか違うんじゃないか?と感じています。(感覚ですが…)
もっと良い方法がありますか?
wwwファイルを弄らないで済むのが最も良いという考えですが、それがあっているのかどうかも含めてです。

質問背景

(筆者の浅学ゆえ、とんちんかんなことを言っているかもしれません。)

namespaceを動的に生成する方法があることは実のところ調べました。
しかし、wwwファイルでsocket.ioオブジェクトを管理している現状、例えば利用者が新しいルームを作成する時に、ルータの処理でsocket.ioオブジェクトにアクセスし、namespaceを生成できるのだろうか?という疑問に当たりました。
データベースにルームの情報を保存し、socket.io側で定期的に取得しに行く…などとすれば出来るのかもしれませんが、それはあまりスマートではない気がしています。
もっと良いやり方を使えばスマートに実現できるのではないか、と考え、このような質問形式とさせていただきました。

このあたりの疑問を解決してくだされば、更に嬉しいです。

###追記
①について、自己解決しました。
ドキュメントを読み直したところ、namespaceを正規表現で受け取れることがわかりました。

https://socket.io/docs/server-api/#server-of-nsp

②についてはっきりさせたいので、引き続き回答お待ちしています。

補足情報

node.js 10.16.3
socket.io 2.3.0
express 4.16.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。
そのものズバリのトピックがStackOverflowにありました。
後学のために解決策を載せておきます。

https://stackoverflow.com/questions/24609991/using-socket-io-in-express-4-and-express-generators-bin-www

app

1var express = require( "express" ); 2var socket_io = require( "socket.io" ); 3 4// Express 5var app = express(); 6 7// Socket.io 8var io = socket_io(); 9app.io = io;

www

1/** 2 * Create HTTP server. 3 */ 4 5var server = http.createServer( app ); 6 7 8/** 9 * Socket.io 10 */ 11 12var io = app.io 13io.attach( server ); 14

app.ioを定義してしまい、www内でattachするようです。

投稿2020/02/16 13:09

udoP_

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問