为什么我会收到“未定义”错误?

时间:2014-08-25 12:29:50

标签: mongodb meteor iron-router

我正在研究一个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')时,我在Chrome的开发控制台中遇到以下错误:Exception from Deps recompute function: TypeError: Cannot read property '_id' of undefined,指向使用调用Books.find()时的userDoc._id。

这没有任何意义,因为我能够使用meteor mongo同时使用db.users.find({username: "misutowolf"})db.users.find({username: "test2"})形式的{{1}}找到包含相关名称的用户文档。

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

1 个答案:

答案 0 :(得分:2)

默认情况下,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;
  }
  // ...
}