【问题标题】:Why am I getting this 'undefined' error?为什么我会收到此“未定义”错误?
【发布时间】:2014-08-25 12:29:49
【问题描述】:

我正在从事 Meteor 项目,但由于某种原因,此个人资料模板无法正常工作。

我正在使用以下代码,以及用于用户管理的 accounts-passwordaccounts-entry 包:

this.route('profile', {
    path: '/profile/:username',
    data: function() {
        var userDoc = Meteor.users.findOne({"username": this.params.username});
        var bookCursor = Books.find({owner: userDoc._id});
        return {
            theUser: userDoc,
            theBooks: bookCursor
        };
    }
});

当我尝试访问我的测试帐户(分别为“misutowolf”和“test2”)的配置文件 URL 时,Chrome 的开发控制台中出现以下错误:Exception from Deps recompute function: TypeError: Cannot read property '_id' of undefined,指向使用 userDoc ._id 在对Books.find() 的调用中。

这毫无意义,因为我能够使用meteor mongo 和两个用户名(db.users.find({username: "misutowolf"})db.users.find({username: "test2"}) 形式)找到具有相关名称的用户文档。

我很困惑,根本不知道是什么导致了这个问题。

【问题讨论】:

    标签: mongodb meteor iron-router


    【解决方案1】:

    默认情况下,Meteor 仅通过自动设置发布发布当前登录的用户信息。

    您需要做的是向客户端推送您尝试使用的用户信息 (username),因为如果您不这样做,您正在访问的用户不会发布到客户端,并且访问其_id 时出现未定义错误。

    首先,设置一个专用发布(在服务器上):

    Meteor.publish("userByUsername",function(username){
      return Meteor.users.find({
        username:username
      });
    });
    

    然后waitOn这个出版物在你的路线:

    waitOn:function(){
      return this.subscribe("userByUsername",this.params.username);
    }
    

    最后,在用户文档被推送到客户端之前,请注意不要访问它,因为即使您正在等待订阅,即使订阅尚未准备好,data 方法实际上也可能会被调用。

    data: function() {
      var userDoc = Meteor.users.findOne({"username": this.params.username});
      if(!userDoc){
        return;
      }
      // ...
    }
    

    【讨论】:

    • 你太棒了!我从没想过要弄乱出版物/订阅,因为我的项目中仍然启用了自动发布。我想我只是认为它对 Meteor.users 也有影响,但我错了。非常感谢,你最近救了我几次。 :)
    • 在用户文档被推送到客户端之前不要访问用户文档最好使用loading hook;只需在客户端的任何位置添加Router.onBeforeAction('loading') 并照常使用data 函数。
    • 根据我的经验,添加loading 钩子不会阻止data 方法在waitOn 列表准备好之前被调用。
    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多