2013-03-23 74 views
3

我想在服務器腳本中創建一個函數,該函數可以返回一個集合加上一些額外的值。 例如:獲取一個集合併爲響應添加一個值

Meteor.publish("users", function() { 
    var users; 
    users = Meteor.users.find(); 
    users.forEach(function (user){ 
     user.profile.image = "some-url"; 
    }); 
    return users; 
}); 

但是這不起作用。 我的問題是:在發佈函數中向集合響應中添加值的正確方法是什麼?

回答

2

這對服務器來說很重要嗎?您可以使用客戶端上的轉換函數:

客戶端JS現在

//Somewhere where it can run before anything else (make sure you have access to the other bits of the document i.e services.facebook.id otherwise you'll get a services is undefined 

Meteor.users._transform = function(doc) { 
    doc.profile.image = "http://graph.facebook.com/" + doc.services.facebook.id + "/picture"; 
    return doc; 
} 

當你這樣做:

Meteor.user().profile.image 
=> "http://graph.facebook.com/55592/picture" 

我已經打開前一個問題,有關於共享轉換到客戶端:https://github.com/meteor/meteor/issues/821

+0

謝謝@Akshat!在哪裏可以找到更多關於'_transform'方法的信息? – rec 2013-03-23 23:13:08

+1

看看http://docs.meteor.com/#collections,這是一個稍微向下的例子。我上面使用的_transform沒有記錄,但它允許與文檔中的用戶集合相同的使用 – Akshat 2013-03-24 07:07:53

+0

對不起,但我無法做到這一點,我看不到'Meteor.user() .profile' – rec 2013-03-25 06:07:22

3

有兩種方法可以實現發佈功能:

  1. 通過返回一個光標(或光標的陣列)
  2. 通過使用this.added(),this.changed()和this.removed()。

只有方法2允許修改返回的文檔。

請參閱流星文檔here。然而,由於提供的示例代碼可能是複雜的,這裏是另一個問題:

// server: publish the rooms collection 
Meteor.publish("rooms", function() { 
    return Rooms.find({}); 
}); 

等同於:

// server: publish the rooms collection 
Meteor.publish("rooms", function() { 
    var self = this; 
    var handle = Rooms.find({}).observeChanges({ 
    added: function(id, fields) { self.added("rooms", id, fields); }, 
    changed: function(id, fields) { self.changed("rooms", id, fields); }, 
    removed: function(id)   { self.added("rooms", id); }, 
    } 
    }); 
    self.ready(); 
    self.onStop(function() { handle.stop(); }); 
}); 

在第二個示例中,您可以在發送前修改「字段」參數如下所示:

added: function(id, fields) { 
    fields.newField = 12; 
    self.added("rooms", id, fields); 
}, 

來源:this post

相關問題