前提・実現したいこと
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
あなたの回答
tips
プレビュー