現在Node.jsを用いたチャットアプリの開発を行なっており、ルーティングして割り当てられたアドレスの処理をsessionを絡めたsocket通信にしたいと考えています。
ですが通信やsocket.io、Node.jsそのものへの理解がまだ乏しく、次のようなエラーが出ており、解決できずにいます。
TypeError: Cannot read property 'on' of undefined at ~/prj/routes/users.js
以下に関係するコードを抜粋して記載します。
js
1// ~/prj/bin/www 2 3var app = require('../app'); 4var debug = require('debug')('hoge:server'); 5var http = require('http'); 6var sessionMiddleware = app.session; 7 8var port = normalizePort(process.env.PORT || '3000'); 9app.set('port', port); 10 11var server = http.createServer(app); 12var { Server } = require("socket.io"); 13var io = new Server(server); 14 15io.use((socket, next) => { 16 sessionMiddleware(socket.request, {}, next); 17 }); 18 19console.log(io); 20 21// io.on('connection', (socket) => { 22// socket.on('chat message', (msg) => { 23// io.emit('chat message', {value : msg.value}); 24// console.log(socket.request.session.login); 25// }); 26// socket.on('server_to_client_broadcast', (msg) => { 27// socket.broadcast.emit('chat message', msg); 28// }); 29// }); 30 31server.listen(port); 32server.on('error', onError); 33server.on('listening', onListening); 34 35// ---略--- 36 37module.exports = io;
js
1// ~/prj/app.js 2 3var express = require('express'); 4var session = require('express-session'); 5var sessionMiddleware = session({ 6 secret: 'keyboard cat', 7 resave: false, 8 saveUninitialized: false, 9 cookie: { maxAge: 60 * 60 * 1000 } 10}); 11 12var indexRouter = require('./routes/index'); 13var usersRouter = require('./routes/users'); 14 15var app = express(); 16 17app.use('/', indexRouter); 18app.use('/users', usersRouter); 19app.use(sessionMiddleware); 20app.session = sessionMiddleware; 21 22// ---略--- 23 24module.exports = app;
js
1// ~/prj/routes/users.js 2 3var express = require('express'); 4var router = express.Router(); 5var db = require('../models/index'); 6const io = require('../bin/www'); 7 8router.get('/', (req, res, next) => { 9 // エラーの該当箇所 10 io.on('connection', (socket) => { 11 socket.on('chat message', (msg) => { 12 io.emit('chat message', {value : msg.value}); 13 }); 14 socket.on('server_to_client_broadcast', (msg) => { 15 socket.broadcast.emit('chat message', msg); 16 }); 17 }); 18 console.log(io); 19 20 db.User.findAll().then(usrs => { 21 var data = { 22 title: 'Users/Index', 23 content: usrs 24 }; 25 res.render('users/index', data); 26 }); 27}); 28 29// ---略--- 30 31module.exports = router; 32
/prj/routes/users.jsのエラー該当箇所について、もともとは/prj/bin/wwwのコメントアウト部分に記載しており、この時は正常に通信ができておりました。
そこでwwwをexportし、コードを~/prj/routes/users.jsに引越しすることで、もともとできていた処理をルーティングしたアドレスにて実現を図りましたが、できませんでした。
export前後でのconsole.log(io);の出力も
[object Object]
と変わらず、解決の糸口が見えません。
おそらくエラーからioがうまく渡せていないと思うのですが、何卒お力添えいただけますと幸いです。
よろしくお願いします。
あなたの回答
tips
プレビュー