服务器上奇怪的未定义错误

时间:2015-01-30 14:29:56

标签: meteor

我有以下流星方法

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);
  },

我从上面打电话给这个私人助手

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;
};

我在这里从客户那里打电话

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); }
  });
  ...

但是,当我最初加载模板时,我在服务器上得到一个未定义的错误(我在代码中标记了位置)。虽然,当我尝试使用相同的userId在客户端上调用相同的查询时,我正确获取用户记录

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

试试这个。

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")
}

也许当你制作Meteor.call时,数据尚未准备好

同样可以肯定的是,当您在console.log上运行Users.findOne({_id: userId }, { fields: { services: 0 } });时会得到什么?

可能发现错误或有一些错字

<强>更新

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

waitOn

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

答案 1 :(得分:0)

Meteor将所有用户记录存储在Meteor.users集合

所以请尝试Meteor.users.findOne({_id: userId }....)

而不是Users.findOne({_id: userId }, { fields: { services: 0 } });

在您的服务器方法