我正在开发一个Node.js应用程序,该应用程序使用Socket.io来处理实时通信。我的代码充满了On和Emit功能。我也使用房间功能。我的应用程序看起来像这样:
var server = require('http').Server();
var io = require('socket.io')(server);
io.on('connection', function(socket){
socket.on('event1', function(data){"lots of socket and non-socket codes" });
socket.on('event2', function(data){"lots of socket and non-socket codes" });
socket.on('event3', function(data){"lots of socket and non-socket codes" });
socket.on('disconnect', function(){"Some other code"});
});
server.listen(portNum);
它工作正常,但这不是我理想的解决方案。 首先,在这种方法中,一切都在一个大文件中,而不是具有独立功能的较小文件。
其次,调试和维护这个应用程序非常困难,因为当涉及1000多行代码时它非常混乱。
这是我的问题:
是否有开发企业级Socke.io应用程序的首选/最佳实践? 如果是的话,是否有任何大型的开源Socket.io应用程序可以演示这个approch或任何帮助我以更好的方式重构我的代码的文章?
答案 0 :(得分:8)
我认为首先将每个回调函数放在你从io.on('connection')中放出的不同函数中,也可以将它们放在一个不同的文件中(使用module.exports),你将开始有一个更清晰的应用。
好吧所以我会给你写一个我使用的可能性,我不知道它是否是socket.io中宇宙的最佳模式,但我觉得这很好。
在你的主文件(带有io.onconnection的文件)中,你可以有这样的东西(你不必使用命名空间,这只是一个例子):
var SocketEvent = require('./socketEvent');
io.of('/user').on('connection', function (socket) {
SocketEvent.load_common_event(socket);
SocketEvent.load_user_event(socket);
});
io.of('/operator').on('connection', function (socket) {
SocketEvent.load_common_event(socket);
SocketEvent.load_operator_event(socket);
});
在你加载的socketEvent.js中你可以拥有:
exports.load_common_event = function(socket){
socket.on('disconnect', function(){"Some other code"});
};
exports.load_user_event = function(socket){
socket.on('event1', function(data){"lots of socket and non-socket codes" });
socket.on('event2', function(data){"lots of socket and non-socket codes" });
socket.on('event3', function(data){"lots of socket and non-socket codes" });
};
exports.load_operator_event = function(socket){
socket.on('event4', function(data){"lots of socket and non-socket codes" });
socket.on('event5', function(data){"lots of socket and non-socket codes" });
socket.on('event6', function(data){"lots of socket and non-socket codes" });
};
如果您有任何疑问,请告诉我
添加-上强>
如果你想要像Socket.on('event',myModule.doSomething)这样的东西;
你可以在模块中这样做:
客户:
var myModule = require('./socketModule');
io.on('connection', function (socket) {
socket.on('event' , myModule.doSomething(/*some parameters (socket)*/));
});
server socketModule.js:
exports.doSomething = function(/*some parameters (socket)*/){
/* Some processing around */
};
答案 1 :(得分:0)
对于那些对传递参数感到疑惑的人来说,.bind
是一个选择
const events = require('./events.js')
io.of('/chat').on('connection', (socket) => {
socket.on('print', events.print.bind({socket, io}))
})
event.js
const util = require('util')
function print(data) {
console.log(util.inspect(this.socket).substr(0, 100))
console.log(util.inspect(this.io).substr(0, 100))
}
module.exports = {
print
}
答案 2 :(得分:-1)
更多地使用页面,每个页面中的代码更少,并在需要时独立共享它们: 注意,我认为您正在使用Express。如果没有,请从我的演示中删除快递。
SELECT a.c1subject AS "SUBJECT",
a.c3author AS "FROM",
a.c4recipients AS "TO",
b.date,
c.folderURI AS "FOLDER_LOCATION",
c.name AS "FOLDER_NAME"
FROM messagesText_content a
INNER JOIN messages b ON a.docid=b.id
INNER JOIN folderLocations c ON b.folderID=c.id
WHERE a.c1subject LIKE ('Chunk of text%');
现在,在API或服务器上的每个页面上,您都可以像这样导入Io实例(参考且高效):
// app.js
var app = require('express')();
module.exports = app;
// server.js
var app = require('./app');
var server = require('http').createServer(app);
module.exports = server;
//socket-io-redis.js
var server = require('../server');
var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
io.set('origins', '*:*');
module.exports = io;
您还可以制作一个主连接文件,如下所示: 注意,我在这里粘贴我实际使用的确切代码,只是为了向您展示我的一些最佳做法(当然,可以根据需要进行调整和调整):
var Io = require('../path/to/io-config-file');
console.log(Io); // object
Io.to(room).emit(event, payroll);
在上面的示例中,我监听了新的连接,并经过安全验证将其订阅到各自的房间。我这样做是为了使用服务-它们是独立的,正如我所说的那样,这就是您所有代码的样子。