嘿伙计们我试图让它成为默认用户包的用户配置文件具有user.profile.friendList的属性,它只是一个引用取消引用friendList集合的外键我在哪里存储用户的朋友。不过,它说未定义的属性friendList并不存在。
这是与我有关的服务器端JS:
friends = new Mongo.Collection("friends");
Accounts.onCreateUser(function(options, user) {
// We're enforcing at least an empty profile object to avoid needing to check
// for its existence later.
user.profile = options.profile ? options.profile : {};
friends.insert({owner:Meteor.userId()});
user.profile.friendList = friends.findOne({owner:Meteor.userId()})._id;
return user;
});
Meteor.publish("friendsPub", function(){
list = this.userId.profile.friendList;
if(list) return friends.findOne({owner:list});
});
以下是与之交互的客户端js:
Template.login.helpers({
getFriends: function(){
if(Meteor.userId()){
Meteor.subscribe("friendsPub");
return friends.find().fetch();
}
},
并且应该做的就是创建一个具有朋友ID的用户作为用户配置文件的属性friendList。然后它使用它来获取friends集合中列出的用户。我意识到它只会在friendsList中显示用户的id,但是我想让它在我做实际的朋友用户名之前启动并运行。
答案 0 :(得分:1)
sampledInput = sI+1i*sQ;
Meteor.userId
位于onCreateUser内(帐户尚未创建)。一种可能性是检查onLogin内的朋友列表。尝试这样的东西:
null
或者,您可以让客户端调用这样的方法:
Accounts.onLogin(function(data) {
var user = Meteor.users.findOne(data.user._id);
if(_.isEmpty(user.profile.friendList)) {
// insert stuff here
}
});
来自Accounts.createUser的回调。
第三种选择是将用户标记为" new"并扫描一个cron作业中的所有新用户。有关详细信息,请参阅this issue。
另请注意,Meteor.methods({
addFriendsList: function() {
var user = Meteor.users.findOne(this.userId);
if(_.isEmpty(user.profile.friendList)) {
// insert stuff here
}
}
});
需要返回光标,而不是文档(您希望发布商调用friendsPub
而不是find
)。
答案 1 :(得分:0)
与其他人一样,onCreateUser中还没有userId。我建议您将电子邮件添加到通用列表中或者更好,只需将空的好友列表添加到配置文件中,然后将其填入其他userId' s。下面的代码是您如何正确地将属性添加到用户配置文件。
Accounts.onCreateUser(function(options, user){
console.log(options.email); // possible available identifier
var customProfile = new Object();
customProfile.friendList= [];
user.profile = customProfile;
return user;
});
答案 2 :(得分:0)
我认为出版物应该返回光标,如
中记录的那样http://docs.meteor.com/#/full/meteor_publish
friendsPub
发布使用findOne
返回单个文档。引用:
如果发布函数没有返回游标或游标数组,则假定它使用低级别添加/更改/删除的接口,并且一旦初始记录集完成,它也必须调用就绪。