我正在研究一个Meteor项目,由于某种原因,这个配置文件模板拒绝工作。
我正在使用以下代码,以及用于用户管理的accounts-password
和accounts-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}}找到包含相关名称的用户文档。
我很困惑,不知道是什么导致了这个问题。
答案 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;
}
// ...
}