简体   繁体   中英

Collection helper throws a not defined error

Im trying to set up a list of "rooms". The intended sequence:

  1. Click name of the user on his/her profile page
  2. Check for existing room. If yes, go to that room, if not set up new room.

Im using both dburles:collection-helpers and reywood:publish-composite .

Its throwing me this error.

TypeError: Cannot read property 'username' of undefined at Document.Rooms.helpers.recName (rooms.js:18)

And line 18 is: return Meteor.users.findOne({ _id: this.receiver }).username;

ie _id: this.receiver is undefined.

I also tried to add protective checks in the collection helpers but error remains. Ie return user && user.username for example .

One thing I note is that, I noticed when I click on the user, it goes to the room linked to the user's id. However when I click back, it jumps to a blank room with a different id thats unrecognised.


The relevant codes:

Server publish

Meteor.publish("onlusers", function (){
 return Meteor.users.find({}); 
});

Rooms.js collection helper

Rooms.helpers({
  recName: function() { 
    return Meteor.users.findOne({ _id: this.receiver }).username;
  }
});

User.js (for profile page events)

Template.usersShow.events({
  'click .user': function() {
    var receiver = this._id;
    Session.set('chatId', this._id);
    var res = Rooms.findOne({  
      $or: [ 
        { owner     : this._id },
        { receiver  : this._id }
      ]
    });
    if(res){     
      Router.go('roomDetail', { "_id" : res._id });
    } else {
      var newRoom = Rooms.insert({
        owner     : Meteor.userId(),
        receiver  : receiver, 
        username  : Meteor.user().username,
      });
      Session.set('roomid', newRoom);
      Router.go('roomDetail', { "_id" : newRoom });
    }
  }
});

Your diagnosis:

_id: this.receiver is undefined.

May be misleading. What is also possible is that the user subscription isn't completely loaded when your helper runs. I was helping someone else with a similar problem with publish-composite the other day - the subscription is marked as ready when the parents are ready but the children may not have finished loading yet. I think of this as a bug in publish-composite, all the related objects really need to be there before the subscription can be marked as ready.

Instead of returning:

return Meteor.users.findOne({ _id: this.receiver }).username;

You can do:

var user = Meteor.users.findOne({ _id: this.receiver });
return user && user.username;

So you'll get nothing back until the user object loads but you won't throw an error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM