我有各种客户端连接到我的服务器,我需要在每个客户端上定义一个事件,但是基于某些逻辑,而不是无条件。像:
for(i= 0; i<= this.users.length; i++) {
if (i=== actionUserOrdinal) {
io.sockets.socket(mySocketId).on('action', function(action) {...
但这样做会在运行应用程序的过程中为某些套接字定义多次。因此,它也会被多次调用(通过相同的触发器)。
如果我将其定义为默认方式,
io.sockets.on('connection', function(socket) {
socket.on('action', function(data) {
...
我无法访问我的主app逻辑变量等。除非我做一些全球性的事情。
我想到的一个解决方案是在触发后删除事件
for(i= 0; i<= this.users.length; i++) {
if (i=== actionUserOrdinal) {
thisocket = io.sockets.socket(mySocketId);
io.sockets.socket(mySocketId).on('action', function(action) {
delete thisocket._events.action;
(谢谢@ArdiVaba)
但我发现这种情况很脆弱,有时候事件仍会被解雇两次。
是否有其他方法来定义事件,以便不会多次定义,通过在主应用程序的逻辑本身中定义它,或者通过在默认范围内定义它,我仍然可以访问我的主要应用程序的变量没有走向全局?
答案 0 :(得分:1)
不是为每个用户定义可能的不同事件,而是为所有用户监听所有事件,并在函数中验证是否允许用户使用此事件。
使用sessionSockets存储用户类型及其权限
// checkPermission function check if user is allowed to do something
checkPermissions = function(function_name, session, callback) {
if(!session) {
callback(null);
return;
}
if(!session.user) {
callback(null);
return;
}
// If user is superuser, he has the right to do everything
if(!session.user.superuser) {
callback('allowed');
return;
}
// TODO Here check with user and function_name if user has the right
// to use this function
// use callback('allowed') if he is allowed
// use callback(null) if he is not allowed
}
sessionSockets.on('connection', function (err, socket, session) {
socket.on('event', function() {
checkPermission('event', session, function(r) {
if(r === 'allowed') {
// User is allowed
// Do your thing
} else {
// User is not allowed
// send error message to user ?
}
});
});
});