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 に答える