套接字更新所有订阅模型本身的用户期望更新的用户
Sockets update all the users who are subscribed to the model itself expect for the user who got updated
我有用户订阅聊天用户,用户可以通过套接字使自己在线或离线,
其中一个用户具有管理员的角色,他可以通过 Http 请求 User.update 强制用户在线或离线,我还添加了 User.publishUpdate 来提醒订阅者.
问题是当管理员将用户从离线状态转为在线状态时,对于我们更新的用户,其他用户似乎是在线的,当我在 sails 中启用 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'});
}
});
},
好吧,用户没有得到更新的状态,因为 sails 认为用户自己改变了自己的状态而不是经理,解决方案是创建监听模型变化的套接字监听器,并在 User.update 我发送带有 updatedUserId 的套接字,因此套接字侦听器检查 user.id 是否等于 updatedUserId,它会更改自己的在线状态。
我有用户订阅聊天用户,用户可以通过套接字使自己在线或离线,
其中一个用户具有管理员的角色,他可以通过 Http 请求 User.update 强制用户在线或离线,我还添加了 User.publishUpdate 来提醒订阅者.
问题是当管理员将用户从离线状态转为在线状态时,对于我们更新的用户,其他用户似乎是在线的,当我在 sails 中启用 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'});
}
});
},
好吧,用户没有得到更新的状态,因为 sails 认为用户自己改变了自己的状态而不是经理,解决方案是创建监听模型变化的套接字监听器,并在 User.update 我发送带有 updatedUserId 的套接字,因此套接字侦听器检查 user.id 是否等于 updatedUserId,它会更改自己的在线状态。