套接字更新订阅模型本身的所有用户期望更新的用户

时间:2015-12-23 13:39:17

标签: node.js sockets sails.js sails.io.js

我有用户订阅聊天用户,用户可以通过套接字使自己在线或离线,

其中一个用户具有管理员的角色,他可以通过Http请求User.update强制用户在线或离线,并且我还添加了User.publishUpdate以提醒订阅者。

问题是当经理将用户从离线状态转为在线状态时,看起来用户对于我们更新的用户本人是在线的,并且当我在风帆中启用autoWatch时问题就会消失。

这里是套接字代码:

 var query= {authType: 'google'}; //TODO this is temp, currently the staff will see only staff users, until we fix the performance issue
        if (user.dealershipCompany) {
          query = {
            or: [{
              authType: 'google',
              dealershipCompany: null
            }, {
              authType: 'local',
              dealershipCompany: user.dealershipCompany
            }]
          };
        }
        sails.log.info('Chat Users Query:\n', query);
        User.find(query).exec(function (err, chatUsers) {
          if (err) {
            return callback(err, {
              projectedUser: null,
              porjectedChatUsers: null
            });
          } else {
            // remove the logged in users to avoid self messaging
            _.remove(chatUsers, {
              id: userId
            });
          }
          // Subscribe the connected socket to changes in the online state of chatUsers
          User.subscribe(req.socket, chatUsers, 'update');
        });

此处用户更新:

 update: function (req, res) {
    var id = req.param('id');
    User.findOne(id).exec(function (err, user) {
      if (err)
        res.serverError(err)
      else if (user) {
        var firstName = req.param('firstName') || user.firstName;
        var lastName = req.param('lastName') || user.lastName;
        var role = req.param('role') || user.role;
        var email = req.param('email') || user.email;
        var online = req.param('online') || user.online;
        user.firstName = firstName;
        user.lastName = lastName;
        user.email = email;
        user.role = role;
        user.online = online;
        user.save(function (err, updatedUser) {
          if (err)
            res.serverError(err);

          User.publishUpdate(updatedUser.id, {
            online: updatedUser.online
          }, req);
          res.ok(updatedUser);

        });
      }
      else {
        res.notFound({error: 'User with id: ' + id + ' Could not be found'});
      }

    });
  },

1 个答案:

答案 0 :(得分:0)

好吧,用户没有获得更新状态,因为sails认为用户自己改变了自己的状态而不是管理员,解决方案是创建套接字监听器来监听模型的更改并在User.update中发送带有updatedUserId的套接字,所以套接字监听器检查user.id是否等于updatedUserId,它改变了自己的在线状态。