在发布功能中替换文档的属性

时间:2014-05-28 19:03:51

标签: javascript meteor publish-subscribe

我正在使用meteor,我对发布功能(服务器端)有疑问

Meteor.publish('users', function () { .... }

我现在将文件发送到具有其他收藏品ID的浏览器。例如,任务文档属于项目

{ 
    title: '....',
    projectId: 'KjbJHvJCHTCJGVY234',
    ...
}

我想要的是在此文档projectTitle中添加属性,因此我不必在客户端上查找项目。但是,当我在publish函数中添加此属性时,它不会发送到客户端。这就是我尝试过的:

Meteor.publish('tasks', function () {
    var tasks = Tasks.find();

    tasks.forEach(function (task) {
       var project = Projects.findOne({_id: task.projectId});
       task.projectTitle = project.title;
    });

    return tasks;
}

如何修改发布函数中的文档(非持久性)?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

Meteor.publish("tasks", function() {

    var transform = function(task) {
        var project = Projects.findOne({_id: task.projectId});
        task.projectTitle = project.title;
        return task;
    }

    var self = this;

    var tasks = Tasks.find().observe({
        added: function (document) {
            self.added('tasks', document._id, transform(document));
        },
        changed: function (newDocument, oldDocument) {
            self.changed('tasks', document._id, transform(newDocument));
        },
        removed: function (oldDocument) {
            self.removed('tasks', oldDocument._id);
        }
    });

    self.ready();

    self.onStop(function () {
        tasks.stop();
    });

});

那里有很多自定义逻辑,但'transform'基本上添加了属性。

答案 1 :(得分:0)

您的代码看起来不错,但您忘记了任务请求中的.fetch()方法。它应该是var tasks = Tasks.find().fetch();