sails.js中的多个单独聊天

时间:2014-08-16 05:35:23

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

我在sails.js上看到了几个聊天功能的例子。但是,所有用户都会创建一个大聊天,所有用户都可以放置。

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

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

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

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

然而,Sails.js隐藏了这个级别。结果,我不知道如何在服务器上配置它。

我看到了similar question。但是,它相当陈旧(考虑到Sails.js的变化速度)。我不知道我应该在哪里放置有关Model.subscribe和Model.publish的代码,考虑到它都是按惯例隐藏的(所以看起来我需要在自动订阅时覆盖一些默认行为)。

2 个答案:

答案 0 :(得分:2)

首先,您需要覆盖findcreate蓝图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中关闭它。