1

我有流星方法:

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变量集调用。

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

于 2015-10-20T13:14:46.877 回答