Meteor.call 即使有回调函数也会引发异常

Meteor.call raises exception even with a callback function

我有流星法:

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
}

异常记录到控制台:

Exception while simulating the effect of invoking 'orderStatusUpdate' errorClass {message: "Match error: Note is required", path: "", sanitizedError: errorClass, errorType: "Match.Error", invalidKeys: Array[1]} Error: Match error: Note is required

据我所知,当我调用 check(...) 时会引发异常。

如何捕获此异常以正确地向客户显示?

顺便说一句,回调函数也是用 error 变量集调用的。

为什么不直接抓住它?

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

请注意,异常是在方法的模拟版本中抛出的,即直接在客户端抛出。服务器端异常会在回调的error中传递,而客户端代码直接抛出。以上应该抓住这个。

raised/logged 异常与回调或缺少回调无关。

如果该方法在共享文件夹中定义(由客户端和服务器评估),存根 将在客户端上运行。如果它抛出任何东西,错误通常会被捕获并记录到控制台。

回调只与服务端有关运行.

你有多种方法来处理这个问题:

  1. 定义仅服务器方法(在 server 文件夹中)。

    这将使方法 运行 仅在服务器上运行,因此客户端会收到错误。

  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!,并且不会在服务器上调用该方法。