2

我在sails.js 上看到了几个聊天功能的例子。但是,他们所有人都创建了一个大型聊天,所有用户都被放置在其中。

如何创建多个聊天(因此在一个聊天中发布的消息在另一个聊天中不可见)。

我不确定我是否正确理解了这个问题。看起来发生的事情是客户端做io.socket.post('/message', { someMessageData })了,结果订阅了所有消息。

有没有办法过滤它(在服务器端)它只在一个聊天室中订阅消息。

我看到套接字有id。如果服务器端直接使用 socket.io,我只会收集需要发送消息的 id 列表。

但是,Sails.js 隐藏了这个级别。结果,我不确定如何在服务器上配置它。

我看到了类似的问题。然而,它已经相当老了(考虑到 Sails.js 的变化速度)。我不确定我应该把关于 Model.subscribe 和 Model.publish 的代码放在哪里,考虑到它们都是按约定隐藏的(所以看起来我需要在自动订阅时覆盖一些默认行为)。

4

2 回答 2

2

首先,您需要根据 thisfind覆盖和create蓝图。

第二,细看广告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
    };
},
于 2015-09-30T15:55:09.390 回答
1

首先,我相信有三份文件:

坦率地说,仅从文档中很难将其放在一起。所以,我查看了源代码。

反正。问题是我的模型与集合有关联。一旦我的客户阅读了我的模型的一个对象,它就订阅了这个集合的模型。我看到了这个集合模型的所有变化。

我发现有一个名为“Autowatch”的蓝图配置。它控制这种行为(是否订阅所有关联的模型)。如果你在 config/blueprints.js 中关闭它,它就像一个魅力。

于 2014-08-16T19:03:54.817 回答