我正在开发客户端和服务器应用程序(node.js,socket.io用于通信)。在客户端和服务器之间发送的消息有许多不同的类型,我原本以为在传输对象中包含类型:
// Client
var data = {
"type" : 5,
"message" : "Hello, world!"
};
socket.emit("generic_event", data);
在服务器端,这将按原样处理:
// Server
socket.on("generic_event", function(e){
console.log("Got a generic_event!", e.type);
});
但是,也有可能更具体地说明事件类型,例如:
// Client
socket.emit(data.type, data);
// Server
socket.on(1, function(){
console.log("We got '1'!");
});
// Elsewhere on in the server...
socket.on(5, function(){
console.log("We got '5'!");
});
我很想知道以下方案A(单一通用/全能事件)与方案B(多个/多个特定命名事件)的好处。性能?个人编码风格?还有别的吗?
答案 0 :(得分:1)
这主要是一个偏好问题,因为消息以任何一种方式发送给客户端。但是,如果您希望从客户端收到确认,则单独处理每个事件会更加清晰,您也不必执行if/else
或switch
来决定如何处理数据。
这是一个客户端代码示例,它在事件触发时通知服务器。
socket.on('event', function(fn) {
fn();
});
但是,如果您在对象中发送了类型,则仍然只有一个回调。然后,您必须定义客户端将在回调中发送到服务器的响应类型。所以这就是它之间的区别:
socket.on('foo', function(data, fn) {
// foo data
fn();
});
socket.on('bar', function(data, fn) {
// bar data
fn();
});
而且:
socket.on('event', function(data, fn) {
var res = {};
// data of undefined type
if (data.property == 'a_condition') {
res.type = 'type1';
res.data = 'foo';
}
else if (data.property == 'a_condition') {
res.type = 'type2';
res.data = 'bar';
}
fn(res);
});
总而言之,这是个人偏好的问题,因为无论方法如何,都会有从服务器发送到客户端的数据,并且会有一个事件触发客户端。我会建议事件的特定处理程序,因为它不那么混乱,更容易维护。
答案 1 :(得分:0)
在npm
结帐socket.io-events
var io = require('socket.io')(3000);
var router = require('socket.io-events')();
router.on('*', function (sock, args, next) {
var name = args.shift(), msg = args.shift();
sock.emit('received event', name, msg);
});
io.use(router);