Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor从用户ID获取用户名,更简单的方法_Meteor_Meteor Accounts - Fatal编程技术网

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

Meteor从用户ID获取用户名,更简单的方法,meteor,meteor-accounts,Meteor,Meteor Accounts,使用流星: 我有一个存储用户ID的消息列表 Messages = new Mongo.Collection('messages'); // example of message data: { authorId: 'XFdsafddfs1sfd', // corresponding to a Meteor.userId content: 'some Message' } 我同时发布消息和现有用户 Meteor.publish('messages', function () { ret

使用流星:

我有一个存储用户ID的消息列表

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({});
});
目前,我可以抓取消息列表并根据用户名添加用户名。因为用户可以更改他们的用户名和配置文件信息,所以将用户数据添加到集合中是没有意义的,只添加用户名

var messages = Messages.find({}).fetch();
var messages.forEach(function(message) {
    message.username = Meteor.users.find(message.authorId).fetch() [0].username; // ugly
  });
这段代码可以工作,但涉及大量浪费的调用。我想知道如何更好地实现这一点

在Meteor中,将用户数据与包含用户ID的集合配对的最有效和最干净的方法是什么


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

在Meteor中,collection.find()函数提供为此用例传递转换回调

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


这种方式的最大好处是:您仍在使用游标并阻止fetch()。当然,还有更干净的代码。

您是否可以控制消息的创建方式,或者您是否正在读取现有的mongo数据库?您是否阅读过此内容?你可能会感兴趣。我可以控制数据库@汤姆,我来看看,谢谢!剩下的问题似乎是
Meteor.users.findOne()
未定义。伪用户是使用Meteor.users.insert()添加的,它们可以在数据库中的
users
下找到。你知道为什么我不能从Meteor.users.find()访问任何用户数据吗?
Meteor.users
可以在服务器上访问,但使用
transform
时不能在共享的客户端/服务器空间访问。如何转换消息/用户数据?
function transformMessage(message) {
    var user = Meteor.users.findOne(message.authorId);
    if (user) {
        var username = user.username;
        message.username = username;
    }
    return message;
};