我应该定义socket.on('...在io.sockets.on之外的事件('连接...范围?

时间:2014-03-15 13:05:47

标签: node.js socket.io

我有各种客户端连接到我的服务器,我需要在每个客户端上定义一个事件,但是基于某些逻辑,而不是无条件。像:

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)

但我发现这种情况很脆弱,有时候事件仍会被解雇两次。

是否有其他方法来定义事件,以便不会多次定义,通过在主应用程序的逻辑本身中定义它,或者通过在默认范围内定义它,我仍然可以访问我的主要应用程序的变量没有走向全局?

1 个答案:

答案 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 ?
      }
    });
  });
});