【问题标题】:Should I define socket.on('... event outside the io.sockets.on('connection... scope?我应该在 io.sockets.on('connection... 范围之外定义 socket.on('... 事件吗?
【发布时间】:2014-03-16 21:07:15
【问题描述】:

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

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) {
        ...

我无法访问我的主应用程序逻辑的变量等。除非我让一些东西全球化。

我想到的一个解决方案是在事件触发后删除它

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)

但我发现这是不稳定的,有时该事件仍会被触发两次。

是否有其他方法来定义事件,这样它不会被多次定义,要么在我的主应用程序的逻辑中定义它,要么在它的默认范围内定义它,但我仍然能够访问我的主应用程序的变量没有全局化?

【问题讨论】:

  • 做:console.log(io.sockets.socket);然后你会看到socket的内部。某处有所有已定义事件的属性。然后,您可以只使用该信息来不定义某些内容。 (可选地,您可以代理 .on 函数进行检查,这样您就不必更改任何现有代码)。您必须对 .on 函数进行深层复制,并将其存储在您的代理函数中。当代理函数被调用时,它会检查已经存在的事件,如果没有任何东西,你只需调用 .on 函数的深拷贝版本,否则你会从它返回。

标签: node.js socket.io


【解决方案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 ?
      }
    });
  });
});

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2012-01-07
    • 2016-09-21
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2016-01-05
    • 1970-01-01
    相关资源
    最近更新 更多