我在sails.js上看到了几个聊天功能的例子。但是,所有用户都会创建一个大聊天,所有用户都可以放置。
如何创建多个聊天(因此在一个聊天中发布的消息在另一个聊天中不可见)。
我不确定我是否正确理解了这个问题。看起来发生的事情是客户端io.socket.post('/message', { someMessageData })
,结果是订阅了所有消息。
有没有办法过滤它(在服务器端)它只在一个聊天室订阅了消息。
我看到套接字有id。如果服务器端直接使用socket.io,我只会收集需要发送消息的id列表。
然而,Sails.js隐藏了这个级别。结果,我不知道如何在服务器上配置它。
我看到了similar question。但是,它相当陈旧(考虑到Sails.js的变化速度)。我不知道我应该在哪里放置有关Model.subscribe和Model.publish的代码,考虑到它都是按惯例隐藏的(所以看起来我需要在自动订阅时覆盖一些默认行为)。
答案 0 :(得分:2)
首先,您需要覆盖find
和create
蓝图according to this。
第二,仔细查看广告find
蓝图。
为了实现您的目标,您需要更新查询条件并加入适当的(平均过滤的)房间。
更新标准示例:
// Look up the model
var Model = actionUtil.parseModel(req),
criteria = actionUtil.parseCriteria(req),
user = req.user && req.user.id || 0,
allowed = user ? [0, user] : [0],
watchFilters = req.options.hasOwnProperty('watchFilters') ? req.options.watchFilters(req) : false,
classRoom = "sails_model_create_" + Model.identity;
// i need filter by authenticated user so forbidden all other requests
if (allowed.indexOf(user) === -1) {
return res.forbidden();
}
if (watchFilters) {
classRoom = _.reduce(Object.keys(watchFilters), function (classRoom, field) {
return classRoom + "_" + field + "_" + watchFilters[field];
}, classRoom);
}
if (_.result(Model, 'ownerFiltered')) {
criteria.user = user
}
进一步调用watch
方法,
if (req.options.autoWatch) { Model.watch(req); }
您需要将其替换为:
if (req.options.autoWatch) {
sails.sockets.join(socket, classRoom);
sails.log.silly("Subscribed socket ", sails.sockets.id(req.socket), "to", classRoom, "filtered by", watchFilters);
}
为了加入适当的房间。
第三个是使用自己的publishCreate
电话替换create
蓝图中的broadcast
来电:
Model.broadcast(classRoom, Model.identity, {
verb: 'created',
data: data,
id: data[Model.primaryKey]
}, req.socket);
现在您可以使用以下内容过滤模型:
watchFilters: function (req) {
return {
user: req.user.id,
assembly: req.user.assembly || 1
};
},
答案 1 :(得分:1)
首先,我相信有三个文档:
坦率地说,很难仅仅从文档中将它组合在一起。所以,我查看了源代码。
反正。问题是我的模型与集合有关联。一旦我的客户端读取了我的模型的对象,它就会订阅这个集合的模型。我看到了这个收集模型的所有变化。
我发现有一个名为“Autowatch”的blueprint configuration。它控制此行为(是否订阅所有关联的模型)。它就像一个魅力如果你在config / blueprints.js中关闭它。