Tarlen
Tarlen

Reputation: 3797

Weird undefined error on server

I have the following meteor method

hasNoPendingPayments: function() {
    var userId = Meteor.userId();
    console.log(userId); <---------------------- correctly logs userId
    var user   = Users.findOne({_id: userId }, { fields: { services: 0 } });
    console.log(user); <-------------------------- logs 'undefined'
    return hasNoPendingPayments(user);
  },

This private helper I call from the above

hasNoPendingPayments = function(user) {
  // console.log('hasNoPendingPayments ');
  // console.log(user);
  var payments = Payments.find({ userId: user._id, status: {
    $in: [Payments.States.PENDING, Payments.States.PROCESSING]}
  });

  return payments.count() === 0;
};

And I call it from the client here

Template.payments.created = function() {
  this.hasNoPendingPayments      = new ReactiveVar(false);v
};

Template.payments.rendered = function () {
  Session.set('showPaymentRequestForm', false);

  var self = this;
  Meteor.call('hasNoPendingPayments', function(error, result) {
    if (result === true) { self.hasNoPendingPayments.set(true); }
  });
  ...

However, I get an undefined error on the server when I load the template initially (I marked where in code). Although, when I try call the same query on the client with the same userId, i correctly gets the user record

Any idea as to why this is?

Upvotes: 0

Views: 59

Answers (2)

Ethaan
Ethaan

Reputation: 11376

Try with this.

Template.payments.rendered = function () {
  Session.set('showPaymentRequestForm', false);

  var self = this;
if(Meteor.userId()){
  Meteor.call('hasNoPendingPayments', function(error, result) {
    if (result === true) { self.hasNoPendingPayments.set(true); }
  });
}else{
console.log("Seems like user its not logged in at the moment")
}

Maybe when you make the Meteor.call, the data its not ready

Also just to be sure, when you run Users.findOne({_id: userId }, { fields: { services: 0 } }); on console.log what you get?

Maybe the find is wrong or have some typo

update

Router.map(function() 
    {
    this.route('payments', 
        {
        action: function() 
            {
            if (Meteor.userId())
                this.render();
            } else{
                this.render('login') // we send the user to login Template
         }
        }
    }

or waitOn

Router.map(function () {
  this.route('payments', {
    path: '/payments',
    waitOn: function(){
        return Meteor.subscribe("userData"); //here we render template until the subscribe its ready
    }
  });
}); 

Upvotes: 1

Sasikanth
Sasikanth

Reputation: 3043

Meteor stores all the user records in Meteor.users collection

so try Meteor.users.findOne({_id: userId }....)

Instead of Users.findOne({_id: userId }, { fields: { services: 0 } });

in your server method

Upvotes: 0

Related Questions