1

Meteor メソッドがあります。

Meteor.methods({
  orderStatusUpdate: function(orderId, status, note) {
    check(orderId, String);

    var statusData = {
      status: status,
    }
    if (note) {
      statusData.statusNote = note;
    }
    check(statusData, SchemaCompiled.orderStatus);

    Collections.orders.update({_id: orderId}, {$set: statusData});
  }
});

フィールドのカスタム検証statusNote:

custom: function(){
  if (someCondition) {
    return 'required';
  }
  return false;
}

私の問題は、コールバック関数が定義されていても:

Meteor.call('orderStatusUpdate', orderId, orderStatus, note, function (error, result) {
  // doing something
}

例外がコンソールに記録されます。

'orderStatusUpdate' errorClass {message: "Match error: Note is required"、パス: ""、sanitizedError: errorClass、errorType: "Match.Error"、invalidKeys: Array[1]} の呼び出しの効果をシミュレート中に例外が発生しました。エラー: 一致エラー: メモが必要です

私が理解しているように、私が呼び出すと例外が発生しますcheck(...)

この例外をキャッチして顧客に適切に表示するにはどうすればよいですか?

ところで、コールバック関数もerror変数セットで呼び出されます。

4

2 に答える 2

2

なぜそれを捕まえないのですか?

try {
  check(statusData, SchemaCompiled.orderStatus);
} catch (e) {
  if (Meteor.isClient) {
    alert(e);
  }
  if (Meteor.isServer) {
    throw e;
  }
}

例外はメソッドのシミュレートされたバージョン、つまりクライアントで直接スローされることに注意してください。サーバー側の例外はerrorコールバックで渡されますが、クライアント側のコードは直接スローします。上記はこれをキャッチする必要があります。

于 2015-10-20T03:39:05.497 に答える
1

発生/記録された例外は、コールバックまたはその欠如とは関係ありません。

メソッドが (クライアントとサーバーの両方によって評価される) 共有フォルダーで定義されている場合、スタブはクライアントで実行されます。何かがスローされた場合、通常、エラーはキャッチされ、コンソールに記録されます。

コールバックは、サーバー側の実行にのみ関連しています。

これを処理するには、いくつかの方法があります。

  1. メソッド サーバーのみを定義します (サーバーフォルダー内)。

    これにより、メソッドはサーバーでのみ実行されるため、エラーはクライアントで受信されます。

  2. @ChristianFritzが提案したように、クライアントでキャッチして何かをしてください。
  3. throwStubExceptionsスタブが例外をスローした場合に例外をスローし、サーバー メソッドが呼び出されないようにする (現在は) 文書化されていない機能 ( ) を使用します。

    クライアントとサーバーの両方で:

    Meteor.methods({
      thrower: function() {
        throw 'catchMe!';
      }
    });
    

    次に、クライアントで:

    try{
      Meteor.apply('thrower', [], {throwStubExceptions: true}, function(err, res){
        console.log('err!', err);
      })  
    } catch(e) {
      console.log('caught', e);
    }
    

    このコードはエラーをキャッチしてログcaught catchMe!に記録し、メソッドはサーバーで呼び出されません。

于 2015-10-20T13:14:46.877 に答える