【问题标题】:What am I doing wrong when manipulating data in Meteor/MongoDB?在 Meteor/MongoDB 中操作数据时我做错了什么?
【发布时间】:2016-04-19 01:53:38
【问题描述】:

我有这个帮手

myClub: function(){
    var currentUserId = Meteor.userId();
    var user = Meteor.users.findOne({_id: currentUserId});
    return user;
}

我希望它返回 user.role

这是我在 MongoDB 中的用户

{
    "_id" : "RdirmrLG3t8qBk4js",
    "createdAt" : ISODate("2016-04-17T19:40:56.877Z"),
    "services" : {
        "password" : {
            "bcrypt" : "$2a$10$cPe92XR9DT238bH/RanYEu.J6K2ImvAEbWOcVq6j9luI0BH08Qdly"
        },
        "resume" : {
            "loginTokens" : [
                {
                    "when" : ISODate("2016-04-17T19:51:49.474Z"),
                    "hashedToken" : "uVKUj/7JEkkOuizXhjl212Z38E47HXCex+D4zRikQ1k="
                }
            ]
        }
    },
    "username" : "worker",
    "role" : "worker",
    "club" : "hzSKAJfPXo7hSpTYS"
}

上面的代码运行良好。因此它会找到当前用户并输出有关它的信息。但是当我将用户更改为 user.role 时,我收到以下错误消息。

TypeError:无法读取未定义的属性“角色” 在 Object.myClub

它怎么可能是未定义的?我的语法不正确吗?

【问题讨论】:

  • 我现在可以设法输出或检查用户的用户名,但不能检查角色。但它是否与结构有关。当我运行 Meteor.users.find().fetch();在控制台中,我得到了这个 >Object id :"RdirmrLG3t8qBk4js" username :"worker" >__proto__:Object 因此,可以使用 user.username 检索用户名似乎是合乎逻辑的。但角色不在一个级别。我什至找不到在结构中的作用。为什么以及在哪里可以找到它?

标签: mongodb meteor


【解决方案1】:

模板助手是响应式的,这意味着它们会随着应用状态的变化或新数据的出现而自我更新。在您的情况下,当模板被渲染并且 Meteor.users 集合被填充之前,助手会立即被调用。因此,.findOne() 方法返回 undefined。新数据到达后第二遍会修正。

这里的简单修复是检查数据是否存在于助手中:

myClub: function(){
  var currenUserId = Meteor.userId();
  var user = Meteor.users.findOne({_id: currenUserId});
  if(!user) return 'NO DATA';
  return user.role;
},

在现实生活中,您可能希望在渲染模板之前等待加载基本数据。这通常在控制器级别完成。

【讨论】:

  • 好的。我明白了。现在我没有收到任何错误,但它根本没有输出任何东西。
【解决方案2】:

试试:

myClub: function(){
  return Meteor.user() && Meteor.user().role;
}

这是如果有用户则返回角色的简写。

至于role 字段未显示,请确保您从服务器发布该密钥并订阅它。例如:

Meteor.publish('me',function(){
  return Meteor.users.find(this.userId,{fields: {role: 1, username: 1, profile: 1, emails: 1}});
});

在客户端:

var me = Meteor.subscribe('me');
if ( me.ready() ) console.log("Ta-da! The role is: "+Meteor.user().role);

【讨论】:

  • 不是(有用户)=(有用户登录)吗?该代码不会返回任何内容,因此在这种情况下我猜没有用户。但是我已经用一个用户登录了,它有一个角色。
  • 加载用户对象可能需要几毫秒,因此您可以登录并且没有用户对象,但您将拥有userId
  • 好的。但是我仍然无法在用户文档中找到角色字段。我不久前更新了我的问题。
  • 我还将角色和所有其他内容放在 Accounts.createUser 的配置文件中,这使我能够检索它。
【解决方案3】:

确保您订阅了所有需要的数据。

顺便说一句,您可以尝试以下方法:

role: function(){ return (Meteor.user() || {}).role; }

干杯

【讨论】:

  • 谢谢!怀疑订阅。但我在这个项目中仍然有自动发布。那么订阅真的可以成为问题吗?
  • 如果您将自动发布包保留在您的项目中,那么订阅应该不会有任何问题。
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
相关资源
最近更新 更多