我正在处理超过15个不同的套接字事件,我想管理与这些事件相关的模块中的某些socket.io事件。
例如,我想让一个名为login.js的文件处理login
套接字事件,一个名为register.js的文件处理注册套接字事件。
index.js:
socket.on("connection", function (client) {
console.log("Client connected to socket!");
client.on("login", function (data) {
validate(data){
socket.sockets.emit("login_success", data);
}
});
client.on("register", function (data) {
register(data){
socket.sockets.emit("register_success", data);
}
});
});
有没有办法可以将client.on("register", function (data) { ...
放在一个文件中,将client.on("login", function (data) { ...
放在另一个文件中?
答案 0 :(得分:14)
我通常将各种与客户端相关的功能(我通常称之为处理程序)拆分为单独的模块,然后require
并在任何创建socket.io连接的文件中使用它们。
这是一个示例模块,它导出一个期望传递给socket.io client的函数:
/* register-handler.js */
module.exports = function (client) {
// registration related behaviour goes here...
client.on('register', function (data) {
// do stuff
});
};
创建新套接字的文件使用哪个,侦听连接,然后将它们传递给处理程序,然后处理程序侦听客户端上的事件。
/* main.js */
// require your handlers
var handleRegister = require('./register-handler');
// .. set up socket.io
socket.on('connection', function (client) {
// register handlers
handleRegister(client);
});
答案 1 :(得分:3)
这是一种方式
socket.on("connection", function (client) {
console.log("Client connected to socket!");
require('./login')(socket, client);
require('./register')(socket, client);
});
login.js
module.exports = function(socket, client) {
client.on("login", function (data) {
validate(data){
socket.sockets.emit("login_success", data);
}
});
};
答案 2 :(得分:1)
是的,您可以使用exports
和require
。
检查this。
答案 3 :(得分:1)
创建一个侦听器文件夹,将所有事件处理程序放在单独的文件中,然后通过一些技巧您可以包含所有这些侦听器。
在监听器/index.js 中:
module.exports = (io) => {
const fs = require('fs');
const path = require('path');
const listenersPath = path.resolve(__dirname);
io.on('connection', (socket) => {
fs.readdir(listenersPath, (err, files) => {
if (err) {
process.exit(1);
}
files.map((fileName) => {
if (fileName !== 'index.js') {
require(path.resolve(__dirname, fileName))(io, socket);
}
});
});
});
};
然后在不同的文件中,您可以处理侦听器。
监听器/login.js:
module.exports = (io, socket) => {
socket.on('login', (data) => {
// handle the event
});
}
在您的 app.js 文件中:
const initListeners = require('./listeners/index');
const server = app.listen(3000);
const io = require('socket.io')(server);
initListeners(io);
您也可以为事件发射器执行此操作。
答案 4 :(得分:0)
很简单
// export from your handler file:
exports.myHandler = socket => data => { // the socket object is available due to closure }
// import in your socket app.js file
import { myHandler } from './handlers/mySocketHandler'
// now just call the myHandler function.
// pass the socket object from the app.js file and it will return a handler function
socket.on('message', myHandler(socket))