MeteorJS用户配置文件对象属性不存在

时间:2015-08-03 02:08:53

标签: javascript web-applications meteor

嘿伙计们我试图让它成为默认用户包的用户配置文件具有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,但是我想让它在我做实际的朋友用户名之前启动并运行。

3 个答案:

答案 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的回调。

第三种选择是将用户标记为&#34; new&#34;并扫描一个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&#39; 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返回单个文档。引用:

  

如果发布函数没有返回游标或游标数组,则假定它使用低级别添加/更改/删除的接口,并且一旦初始记录集完成,它也必须调用就绪。