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 异常与回调或缺少回调无关。
如果该方法在共享文件夹中定义(由客户端和服务器评估),存根 将在客户端上运行。如果它抛出任何东西,错误通常会被捕获并记录到控制台。
回调只与服务端有关运行.
你有多种方法来处理这个问题:
定义仅服务器方法(在 server 文件夹中)。
这将使方法 运行 仅在服务器上运行,因此客户端会收到错误。
- 按照@ChristianFritz 的建议,在客户端捕获它并采取一些措施。
使用(当前)未记录的功能 (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!
,并且不会在服务器上调用该方法。
我有流星法:
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 异常与回调或缺少回调无关。
如果该方法在共享文件夹中定义(由客户端和服务器评估),存根 将在客户端上运行。如果它抛出任何东西,错误通常会被捕获并记录到控制台。
回调只与服务端有关运行.
你有多种方法来处理这个问题:
定义仅服务器方法(在 server 文件夹中)。
这将使方法 运行 仅在服务器上运行,因此客户端会收到错误。
- 按照@ChristianFritz 的建议,在客户端捕获它并采取一些措施。
使用(当前)未记录的功能 (
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!
,并且不会在服务器上调用该方法。