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

时间:2015-10-20 03:16:24

标签: javascript meteor meteor-methods

我有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:"匹配错误:需要注意",路径:"",sanitizedError:errorClass,errorType:" Match.Error",invalidKeys:Array [ 1]}错误:匹配错误:需要注意

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

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

顺便说一句,回调函数也是在设置error变量的情况下调用的。

2 个答案:

答案 0 :(得分:2)

为什么不抓住它?

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

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

答案 1 :(得分: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!,并且不会在服务器上调用该方法。