Node.JS+Socket.io,将套接字事件处理程序移动到外部模块
Node.JS + Socket.io, moving socket event handlers to external module?
我有一个server.js文件,如下所示:
var express = require('express'),
app = express(),
server = require('http').createServer(app),
mongoose = require('mongoose'),
bodyParser = require('body-parser'),
apiRouter = require('./app/routes/api.js'),
io = require('socket.io')(server),
socketEvents = require('./app/modules/socketEvents.js')(io);
//Clears Node Console.
process.stdout.write(''033c');
console.log('Server starting!');
socketEvents.attachEventHandlers();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.use('/api', apiRouter);
app.use(express.static('public'));
app.use('*', function(req, res, next) {
//All requests return single page angular application.
res.sendFile(__dirname + '/public/index.html');
});
mongoose.connect('localhost', 'triviaattack', function(err) {
if (err) {
console.log('An error occured when connecting to the MongoDB Database');
throw err;
}
});
server.listen(1337);
和socketEvents.js
module.exports = function(io) {
return {
attachEventHandlers: function() {
io.on('connection', function(socket) {
console.log('client connected');
socket.on('joinMatchMaking', function(data) {
//Every time a player joins the matchmaking queue, check if a game can be created.
matchMakingQueue.push(data);
var matchedPlayers = [];
for (i = 0; i < matchMakingQueue.length; i++) {
switch (data.gameType) {
case '1v1':
matchedPlayers.push(matchMakingQueue[i].username);
if (matchedPlayers.length == 2) {
socket.emit('matchFound', {players: matchedPlayers});
}
console.log('user joined 1v1 queue');
case '2v2':
matchedPlayers.push(matchMakingQueue[i].username);
if (matchedPlayers.length == 4) {
socket.emit('matchFound', {players: matchedPlayers});
}
console.log('user joined 2v2 queue');
}
}
console.log(data.username + ' joined the ' + data.gameType + ' matchmaking queue');
console.log('users in queue: ' + matchMakingQueue.length);
});
socket.on('leaveMatchMaking', function(username) {
matchMakingQueue.splice(matchMakingQueue.indexOf(username), 1);
console.log(username + ' left matchmaking queue.');
console.log('users in queue: ' + matchMakingQueue.length);
});
});
console.log('events attached');
}
}
};
当我在浏览器中加载我的网站时,没有调用io.on('connection),函数(){…})事件处理程序,无论何时客户端连接,它都应该输出console.log消息。我想把socket.io事件放在我的主server.js文件之外,因为会有很多事件,我想把它们分成自己的模块。
您需要在html文件中有一些套接字代码才能连接。。你能把它也包括在内吗?
我通过在中间件中填充所有套接字事件来实现这一点:
var io = require('socket.io');
// listen stuff
var SocketEvents = require('./socket-events.js')(io);
io.use(SocketEvents);
然后在socket-events.js
中,类似于
module.exports = function(io) {
return function(socket, next) {
// do stuff
return next();
}
}
我应该补充一点,在这种情况下,on("connection")
侦听器似乎没有必要,因为每个中间件功能都已经在每个传入的套接字连接上执行了。
相关文章:
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 如何减少在移动网络应用程序上播放声音的延迟
- Meteor移动应用程序-嵌入式数据库
- 移动小程序而不重新加载
- Angular UI&引导程序:点击链接时折叠移动导航栏
- 如何在telerik剑道移动应用程序中按下刷新数据源的按钮
- 移动登录应用程序
- jquery移动应用程序无法使用jquryMobile框架JS和css文件的相对路径
- 离子框架移动应用程序性能问题
- 在移动设备上按路径或名称获取二进制图像(Ionic / Ng cordova 应用程序)
- 移动照片库应用程序
- 尝试在移动优先应用程序中从 SQL 数据库获取数据时出错
- 移动优先 - 加密缓存成功和失败处理程序
- 我想在混合移动应用程序中使用Sqlite插件(Cordova)创建一个示例项目
- 地理位置不适用于苹果移动网络应用程序功能
- 移动网络应用程序:在多分辨率设备中使用同一组图像
- 在移动应用程序上滚动iframe会在某个时刻跳到页面顶部
- 仅在移动设备上使用angular ui引导程序转盘
- 在加载移动应用程序页面时调用Javascript函数
- 折叠导航按钮不适用于twitter引导程序设计的移动设备