每个Sails.js
模型都有publishAdd()
方法。当新记录添加到关联模型时,这会通知每个监听器。
此通知不包含新创建的记录。因此,我必须从客户端开始另一个请求以获取新记录。
是否有可能Sails.js发送带有通知的新记录,这样我可以减少我的请求数量?
我意识到接受的答案是这样的: https://gist.github.com/openscript/7016c5fd8c5053b5e3a3
答案 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"}}