2015-07-12 37 views
4

使用流星:流星从userId获取用户名,更简单的方法

我有一个存储userId的消息中的消息列表。

Messages = new Mongo.Collection('messages'); 

// example of message data: 

{ 
authorId: 'XFdsafddfs1sfd', // corresponding to a Meteor.userId 
content: 'some Message' 
} 

而我发布消息和现有的用户。

Meteor.publish('messages', function() { 
    return Messages.find({}); 
}); 

Meteor.publish('users', function() { 
    return Meteor.users.find({}); 
}); 

目前我可以抓取消息列表并添加基于userIds的用户名。由于用户可以更改其用户名&配置文件信息,因此向用户数据添加用户数据(仅userIds)没有任何意义。

var messages = Messages.find({}).fetch(); 
var messages.forEach(function(message) { 
    message.username = Meteor.users.find(message.authorId).fetch() [0].username; // ugly 
    }); 

此代码有效,但涉及大量浪费的调用。我想知道如何以更好的方式实现这一点。

在流星中,什么是最有效的&最简洁的方式来将用户数据与包含userIds的集合配对?

+0

您是否可以控制消息的创建方式或读取现有的mongo数据库? – sergserg

+1

你看过这个吗?可能对你有意思。 https://www.discovermeteor.com/blog/reactive-joins-in-meteor/ – tomsp

+0

我有控制数据库。 @tomsp我会看看,谢谢! – shmck

回答

6

这是一个常见用例:将其他集合的id存储在db中,并在UI上使用人类可读的参数。

在Meteor中,collection.find()函数提供了为这个用例传递一个转换回调。

var cursor = messages.find(
    {}, 
    { 
     transform: transformMessage 
    } 
); 

转换功能现在可以直接修改你的对象,添加/修改/删除您获取对象的属性(注意:不要修改/在客户端删除出于安全原因:不是在使用过滤器服务器端和允许/拒绝)。

function transformMessage(message) { 
    var user = Meteor.users.findOne(message.authorId); 
    if (user) { 
     var username = user.username; 
     message.username = username; 
    } 
    return message; 
}; 

这种方式的好处是:您仍在使用游标并阻止fetch()。当然,更简洁的代码。

+0

看来剩下的问题是'Meteor.users.findOne()'是未定义的。伪用户使用'Meteor.users.insert()'添加,并且可以在数据库中找到用户名。任何想法,为什么我不能从'Meteor.users.find()'访问任何用户数据? – shmck

+0

使用'transform'时,'Meteor.users'可以在服务器上访问,但不能在共享客户端/服务器空间中访问。我如何转换消息/用户数据? – shmck

相关问题