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



Using Meteor:

我在messages中有一个存储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({});
});

目前我可以抓取消息列表并根据userid添加用户名。因为用户可以更改他们的用户名&配置文件信息,将用户数据添加到集合中是没有意义的,只添加userid。

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

这段代码可以工作,但是涉及很多浪费的调用。我想知道如何更好地完成这件事。

在Meteor中,什么是最高效的&最干净的方式配对用户数据与包含userid的集合?

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

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

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

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

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

这样做的最大好处是:您仍然在处理游标,并防止fetch()。当然,还有更简洁的代码。

最新更新