1

我试图在从集合中删除文档时通知订阅者。当调用 observeChanges 的删除函数时,我使用 this.removed(collection, id) :

Meteor.publish('tasks_listsPub', function(sUrl){
    ...
    var self = this;
    ocTasksLists.find().observeChanges({
        added: function (sId, oFields) {
            console.log('added:'+sId);
            self.added('tasks_lists', sId, oFields);
        },
        removed: function (sId) {
            console.log('removed:'+sId);
            self.removed('tasks_lists', sId); //throws a exception but sometimes it works in the browser
        },
        changed: function(sId, oFields){
            console.log('changed:'+sId);
            self.changed('tasks_lists', sId, oFields);
        }
    });
    var cVisibleTasksLists = ocTasksLists.find({_id: {$in: oWs.tasks_lists}});
    return cVisibleTasksLists;
});

问题是服务器抛出异常:

removed:K8BBys7WRH4tTQRBg
Exception in queued task: Error: Removed nonexistent document K8BBys7WRH4tTQRBg
at _.extend.removed (app/packages/livedata/livedata_server.js:181:17)

其他浏览器有时不会删除已删除的文档。有什么解决办法吗?谢谢

4

1 回答 1

2

您似乎在一个发布函数中发布了两个冲突的数据集。

observeChanges 中的 self.added、self.removed 和 self.changed 函数试图让客户端更新 ocTasksLists 中的所有内容。

return cVisibleTasksLists;但是尝试仅发布与您的查询匹配的 ocTasksLists子集。

这些相互冲突的发布指令有时会导致客户端没有从 ocTasksLists 中删除的所有文档 - 您的错误消息结果。

无论您想要整个数据集还是子集,都可以通过返回数据库游标来完成,就像您在最后两行中所做的那样。删除 observeChanges 函数以及 .add、.removed 和 .changed 函数将修复您的错误。

于 2013-07-29T23:46:50.750 回答