Node.JS+Socket.io,将套接字事件处理程序移动到外部模块

Node.JS + Socket.io, moving socket event handlers to external module?

本文关键字:移动 程序 外部 模块 事件处理 套接字 JS+Socket io Node      更新时间:2023-09-26

我有一个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")侦听器似乎没有必要,因为每个中间件功能都已经在每个传入的套接字连接上执行了。