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

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

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

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

Socket.IO

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

Express

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

Q&A

0回答

588閲覧

Node.jsのExpressをカスタマイズしてSocket.ioを使用したい

UpaZiro

総合スコア17

Node.js

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

Socket.IO

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

Express

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

0グッド

0クリップ

投稿2022/03/12 15:35

前提・実現したいこと

socket.ioをNode.jsのExpressを用いた環境下で動作させたいと思い、以下のQiitaの記事を参考に記述を行いました。
しかし、「serverが未定義です」というエラーが出てしまいます。

ちなみにSocket.ioのパッケージは以下のコマンドを実行し保存済みです。

pwsh

1npm install --save socket.io

https://qiita.com/Coolucky/items/4b35622d32d6eae2ebc4

発生している問題・エラーメッセージ

PS C:\Users\user_name\Desktop\sample> npm start > sample@0.0.0 start > node ./bin/www C:\Users\user_name\Desktop\sample\bin\www:48 server.listen(port); ^ ReferenceError: server is not defined at Object.<anonymous> (C:\Users\user_name\Desktop\sample\bin\www:48:1) at Module._compile (node:internal/modules/cjs/loader:1103:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1155:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) at node:internal/main/run_main_module:17:47

ディレクトリ構成

sample
├ bin
│└ www
├ public (以下略)
├ routes
│├ index.js
│├ socketIO.js
│└ users.js
├ views (以下略)
├ app.js
├ package-lock.json
└ package.json

app.js

JavaScript

1//================================= 2//■■■ 必要なモジュールをローディング…① 3//================================= 4 5var createError = require('http-errors'); //HTTPエラーの対処を行うためのもの 6var express = require('express'); //Express本体 7var path = require('path'); //ファイルパスを扱うためのもの 8var cookieParser = require('cookie-parser'); //cookieのパース処理に用いるもの 9var logger = require('morgan'); ///HTTPリクエストのログ出力に関するもの 10 11 12//================================= 13//■■■ ルート用モジュールのロード…② 14//............................................................................ 15//ルートごとに用意されているスクリプトをモジュールとし 16//てロードしておきます。app.jsに沢山処理を書くと汚くな 17//るので、解消するためにファイルをページごとの処理で分 18//割している...と考えるとよい。 19//================================= 20 21var indexRouter = require('./routes/index'); 22var usersRouter = require('./routes/users'); 23 24 25//================================= 26//■■■ expressオブジェクトの作成 27//================================= 28 29var app = express(); 30 31 32//================================= 33//■■■ アプリケーションの各種設定を行う 34//............................................................................ 35//●● app.set('views', path.join(__dirname, 'views')); 36// 37//テンプレートファイルを保存しているディレクトリの明示 38// 39//●● app.set('view engine', 'ejs'); 40// 41//テンプレートファイルの種類 42// 43//================================= 44 45app.set('views', path.join(__dirname, 'views')); 46app.set('view engine', 'ejs'); 47 48 49//================================= 50//■■■ モジュールのどの機能を使うかを設定 51//............................................................................ 52//①でモジュールを読み込んだが、それだけでは機能を使用する 53//ことはできない。app.useで用いるモジュールの機能を呼び出 54//す必要がある。 55//================================= 56 57app.use(logger('dev')); 58app.use(express.json()); 59app.use(express.urlencoded({ extended: false })); 60app.use(cookieParser()); 61app.use(express.static(path.join(__dirname, 'public'))); 62 63//================================= 64//■■■ 静的ファイルの提供 65//............................................................................ 66//イメージ、CSS ファイル、JavaScript ファイルなどの静的 67//ファイルを提供する。 68//================================= 69app.use(express.static("views")); 70 71//================================= 72//■■■ ルート用モジュールの割り当て 73//............................................................................ 74//②でルートに応じたモジュールは読み込みましたが、割り当 75//てはまだでした。app.useで「~にアクセスした時、どのモ 76//ジュールを実行する」…といった風な引数の書き方でモジュ 77//ールを割り当てます。 78//================================= 79 80app.use('/', indexRouter); 81app.use('/users', usersRouter); 82 83 84//================================= 85//■■■ エラー発生時処理 86//================================= 87 88// catch 404 and forward to error handler 89app.use(function(req, res, next) { 90 next(createError(404)); 91}); 92 93// error handler 94app.use(function(err, req, res, next) { 95 // set locals, only providing error in development 96 res.locals.message = err.message; 97 res.locals.error = req.app.get('env') === 'development' ? err : {}; 98 99 // render the error page 100 res.status(err.status || 500); 101 res.render('error'); 102}); 103 104 105//================================= 106//■■■ とりあえず、書いとくやつ 107//================================= 108 109module.exports = app;

bin/www

JavaScript

1#!/usr/bin/env node 2 3//================================= 4//■■■ 各モジュールの読み込み 5//............................................................................ 6//▶Socket.IOの記述はものによっては結構長くなるので、別フ 7//ァイルに書いておいたほうがすっきりする。 8//▶しかし、Socket.IOの記述ができるのは、createServerして 9//いるところと同じファイルでないといけない。 10//▶なのでcreateServerはこのファイルでは行わず、socketIO 11//処理を書いておくモジュール(SocketIO.js)に記載したのち、 12//このページへ読み込む形にする 13//================================= 14 15var app = require('../app'); 16var debug = require('debug')('real-escape:server'); 17 18//var http = require('http'); 19//…★削除 20 21var socketIO = require('../routes/socketIO'); 22//…★追加 23 24//================================= 25//■■■ port番号の宣言 26//================================= 27 28var port = normalizePort(process.env.PORT || '3000'); 29app.set('port', port); 30 31//================================= 32//■■■ ソケットIOのモジュールを実行…★追加 33//================================= 34 35socketIO(); 36 37//================================= 38//■■■ サーバーオブジェクトの作成 39//================================= 40 41//var server = http.createServer(app); 42//…★削除 43 44//================================= 45//■■■ 待ち受け状態にする 46//================================= 47 48server.listen(port); 49server.on('error', onError); 50server.on('listening', onListening); 51 52//================================= 53//■■■ 以下、エラー処理 54//================================= 55 56function normalizePort(val) { 57 var port = parseInt(val, 10); 58 59 if (isNaN(port)) { 60 // named pipe 61 return val; 62 } 63 64 if (port >= 0) { 65 // port number 66 return port; 67 } 68 69 return false; 70} 71 72/** 73 * Event listener for HTTP server "error" event. 74 */ 75 76function onError(error) { 77 if (error.syscall !== 'listen') { 78 throw error; 79 } 80 81 var bind = typeof port === 'string' 82 ? 'Pipe ' + port 83 : 'Port ' + port; 84 85 // handle specific listen errors with friendly messages 86 switch (error.code) { 87 case 'EACCES': 88 console.error(bind + ' requires elevated privileges'); 89 process.exit(1); 90 break; 91 case 'EADDRINUSE': 92 console.error(bind + ' is already in use'); 93 process.exit(1); 94 break; 95 default: 96 throw error; 97 } 98} 99 100/** 101 * Event listener for HTTP server "listening" event. 102 */ 103 104function onListening() { 105 var addr = server.address(); 106 var bind = typeof addr === 'string' 107 ? 'pipe ' + addr 108 : 'port ' + addr.port; 109 debug('Listening on ' + bind); 110} 111

routes/socketIO.js

//================================= //■■■ appモジュールを読み込む //............................................................................ //このappには、www内ですでにポート番号が登録されている //ので、ポート番号を取得したことにもなる //================================= var app = require('../app'); //================================= //■■■ httpモジュールを読み込み、サーバーを立ち上げる //............................................................................ //createServerと同じ扱いである //必要な三要素を揃えて初めてサーバーを立ち上げられる //(app.jsモジュール、httpモジュール、ポート番号) //================================= var http = require('http'); var server = http.createServer(app); //================================= //■■■ httpモジュールを読み込み、 //■■■ サーバーを待ち受け状態に //================================= var io = require('socket.io')(server); //socketIOモジュール function socketIO(){ //サーバーを立ち上げたら実行 server.listen(app.get('port'), function() { console.log('listening!!!'); }); //socket処理を記載する io.on('connection', function(socket){ //socket処理 socket.on('socketName',function(data){ console.log(data); io.sockets.emit('socketName2',data); }) }); }; console.log(server); //export module.exports = socketIO;

補足情報(FW/ツールのバージョンなど)

PS C:\Users\user_name\Desktop\sample> node -v v16.14.0 PS C:\Users\user_name\Desktop\sample> npm -v 8.3.1

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問