如何通过publishAdd() - 通知添加记录(而不仅仅是id)?

时间:2014-05-21 05:34:37

标签: sails.js waterline

每个Sails.js模型都有publishAdd()方法。当新记录添加到关联模型时,这会通知每个监听器。

此通知不包含新创建的记录。因此,我必须从客户端开始另一个请求以获取新记录。

是否有可能Sails.js发送带有通知的新记录,这样我可以减少我的请求数量?

解决方案

我意识到接受的答案是这样的: https://gist.github.com/openscript/7016c5fd8c5053b5e3a3

2 个答案:

答案 0 :(得分:1)

使用默认的publishAdd方法无法获取此记录。但是,您可以覆盖该方法并在实现中执行子记录查找。

您可以通过向该模型类添加publishAdd方法来基于每个模型覆盖publishAdd,或者通过将方法添加到所有模型来覆盖它config/models.js档案。

我会从copying the default publishAdd() method开始,然后根据需要进行调整。

答案 1 :(得分:1)

我知道这是旧的,但我只需要再次解决这个问题,并且不喜欢丢弃重复代码的想法,所以如果有人在寻找替代方案,那么诀窍是更新新创建的记录的模型使用afterCreate:方法。

假设您有一个游戏,您希望玩家订阅。游戏有通知,一组文本提醒,您只希望游戏中的玩家接收。为此,请通过请求在客户端订阅Game。在这里,我通过调用game / gameId获得特定游戏,然后根据模型上已有的通知和玩家构建我的页面:

io.socket.get('/game/'+gameId, function(resData, jwres) {
    let players = resData.players;
    let notifications = resData.notifications;
    $.each(players, function (k,v) {
        if(v.id!=playerId){
            addPartyMember(v);
        }
    });
    $.each(notifications, function (k,v) {
        addNotification(v.text);
    });
});

如我所知,订阅游戏只会提供身份证,但是当我添加通知时,我同时拥有游戏ID和通知记录,因此我可以将以下内容添加到通知模型中:

afterCreate: function (newlyCreatedRecord, cb) {
    Game.publishAdd(newlyCreatedRecord.game,'notifications',newlyCreatedRecord);
cb();}

由于我原来的socket.get订阅特定游戏,我只能使用Game.publishAdd()发布给这些订阅者。现在回到客户端,听取回来的数据:

io.socket.on('game', function (event) { 
if (event.attribute == 'notifications') {
    addNotification(event.added.text);
    }
});

传入的记录将如下所示:

 {"id":"59fdd1439aee4e031e61f91f",
 "verb":"addedTo",
"attribute" :"notifications",
 "addedId":"59fef31ba264a60e2a88e5c1",
 "added":{"game":"59fdd1439aee4e031e61f91f",
 "text":"some messages",
 "createdAt":"2017-11-05T11:16:43.488Z",
 "updatedAt":"2017-11-05T11:16:43.488Z",
 "id":"59fef31ba264a60e2a88e5c1"}}