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

时间:2015-07-12 07:42:22

标签: meteor meteor-accounts

使用Meteor:

我在Messages中有一条消息列表,用于存储userId。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace myProject.Models
{
    public class YourViewModel
    {
        public YourViewModel()
        {

             //This is the constructor of the class
            //Call the function you need
           var tVar = Helpers.CommonFunctions.GenerateSHA("String to process");

        }
    }
}

我发布消息和现有用户。

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

// example of message data:

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

目前,我可以获取消息列表并根据userIds添加用户名。由于用户可以更改其用户名和用户名。个人资料信息,将用户数据添加到集合中只是userIds是没有意义的。

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

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

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

  

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

1 个答案:

答案 0 :(得分:6)

这是一个常见的用例:将其他集合的id存储在数据库中,并在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()。当然,代码更清晰。