我有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
变量的情况下调用的。
答案 0 :(得分:2)
为什么不抓住它?
try {
check(statusData, SchemaCompiled.orderStatus);
} catch (e) {
if (Meteor.isClient) {
alert(e);
}
if (Meteor.isServer) {
throw e;
}
}
请注意,该方法的模拟版本中会抛出异常,即直接在客户端上抛出异常。服务器端异常将在回调的error
中传递,但客户端代码将直接抛出。上面应该抓住这个。
答案 1 :(得分:1)
引发/记录的异常与回调或缺少回放无关。
如果方法是在共享文件夹中定义的(由客户端和服务器评估),则将在客户端上运行存根。如果它抛出任何东西,通常会捕获错误并将其记录到控制台。
回调仅与服务器端运行有关。
您有多种方法可以解决此问题:
定义仅限服务器的方法(在服务器文件夹中)。
这将使该方法仅在服务器上运行,因此将在客户端上收到错误。
使用(当前)未记录的功能(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!
,并且不会在服务器上调用该方法。