0

我在玩meteorjs,很难弄清楚我写的异步方法到底发生了什么。

//in methods.js
feedbackTag = new Meteor.Collection('feedbackTag');

Meteor.methods({
  searchTag: function (tag, collections) {
    var result;
    if(collections.toLowerCase() == 'feedback')
    {
    result = feedbackTag.find({tag: tag});
    }
    return result;
  }
});

//in client.js
  Template.executefb.events({
'keyup input#searchFeedback': 
  function(e) { 
    if(e.which == '13')
    {
      var tag = $('#searchFeedback').val();
      Meteor.call('searchTag', tag, 'feedback', function(err, data){
        //err returns:Internal server error, data returns undefined
        console.log(err, data) 
      });
    }
  }
});

我真的不知道为什么它会返回内部服务器错误:500。请有任何建议。

提前致谢!

更新:

我意识到在客户端调用结果时结果变为“未定义”。但是,如果我直接从客户端调用,即

var result = feedbackTag.find({tag: tag});

它返回我想要的数据。

任何想法如何从方法类中获取结果?谢谢

4

1 回答 1

3

尝试将.fetch()添加到服务器上的集合调用中。这将返回一个实际的数据数组,否则您将返回一个游标,就像在 Meteor.publish() 中一样。

这可能是导致错误的原因。

    Meteor.methods({
      searchTag: function (tag, collections) {
        if(Match.test(tag, String) && Match.test(collections, String) {
          if(collections.toLowerCase() === 'feedback') {
            return feedbackTag.find({tag: tag}).fetch();
          } else {
            console.log("Should have sent feedback, sent " + collections);
          } 
        } else {
          throw new Meteor.Error(400, "Invalid inputs!");
      }
    });

我已经稍微修改了您的代码,因为开始抛出您自己的错误是明智的,并且使用 Meteor 的新 Match 包来验证您的输入也是明智的。

方法将返回错误对象或响应对象通常你会在接收端有一个条件,而不是像使用 console.log 那样尝试显示两者。

function(err, res) { 
  if(!!err) { 
    alert(err.reason); /* or console.log(err) */
  } else {
    console.log(res);
  }
}
于 2013-05-23T11:24:53.733 回答