2014-07-05 50 views
0

現在我有一個在流星裏開發的工作消息系統,用戶可以互相發送私信。流星用戶之間的私人消息

服務器看起來是這樣的:

// .. lot of code 
Meteor.publish("privateMessages", function() { 
    return PMs.find({ to: this.userId }); 
}); 
PMs.allow({ 
    insert: function(user, obj) { 
     obj.from = user; 
     obj.to = Meteor.users.findOne({ username: obj.to })._id; 
     obj.read = false; 
     obj.date = new Date(); 
     return true; 
    } 
}); 
// .. other code 

當用戶訂閱privateMessages,他得到一個蒙戈對象,看起來像這樣:

{ "to" : "LStjrAzn8rzWp9kbr", "subject" : "test", "message" : "This is a test", "read" : false, "date" : ISODate("2014-07-05T13:37:20.559Z"), "from" : "sXEre4w2y55SH8Rtv", "_id" : "XBmu6DWk4q9srdCC2" } 

我怎樣才能改變對象返回用戶名而不是用戶ID?

回答

0

您需要以類似於您將username更改爲_id的方式進行操作。您可以創建一個效用函數:

var usernameById = function(_id) { 
    var user = Meteor.users.findOne(_id); 
    return user && user.username; 
}; 

編輯:

如果你不想輪詢minimongo每個消息,只是包括username而不是_id你的消息對象中。由於username是獨一無二的,它們就足夠了。

如果您的應用程序,你允許用戶更改username,這可能是一個好主意,保持_id備案。

在我一直在使用的其中一個較大的應用中,我們將用戶的_id保留在模型中(以創建鏈接到配置文件等),並緩存了他的profile.name(用於顯示目的)。

+0

返回值在這裏是'user.username',而不是'&& username'。 – Stennie

+0

我可以做到這一點,但它需要循環遍歷所有mongodb文檔,並且會影響性​​能(例如,當有很多消息時) – user3807877

+0

@Stennie其實我認爲如果'user'真的很糟糕,它會返回值'user.username',而不是我假設你期望的布爾值。 – BenjaminRH

-1

我建議從大氣中添加集合幫助程序包。然後爲稱爲toUser的PM創建一個幫助器,返回適當的用戶。 然後您可以使用message.user.name獲取名稱。