[英]Throwing Meteor.Error does not reach the client
因此,基本上,客户端使用Meteor.call
调用服务器。 然后,服务器方法进行一些验证,并使用流星程序包调用Web服务。 如果验证失败并引发流星错误,它将到达服务器。 如果程序包响应有错误,则仅登录服务器。 我需要错误才能到达客户。
代码如下所示。
客户
Meteor.call('callService', (err, result) => {
if(err) {
console.log(err.reason);
}
});
服务器
Meteor.methods({
'callService'(){
if (!Meteor.user()) {
// Error 1
throw new Meteor.Error('insufficient-permissions', 'You need to login first');
}
// Using an meteor package to actually call the service
package.callService(apiKey, (err, response) => {
if (response.status === 'error') {
// Error 2
throw new Meteor.Error('service-error', response.message);
}
});
},
});
在服务器方法中,如果在错误1处引发错误 ,则错误确实会到达客户端,而错误2不会。 错误2仅在服务器上登录。
我猜你的package.callService()
是异步的(假设它接受了回调)。
在这种情况下,您的Meteor方法将启动async任务,然后继续其过程并返回(因为没有更多指令),而async任务仍在运行(实际上正在等待远程Web服务的响应)。 因此,您的客户端Meteor呼叫的回调将收到“无错误”响应。
一旦发生“错误2”,流星调用就已经完成,并且该错误只能记录在服务器上。
如果要“挂断”您的方法,以便它等待package.callService()
的结果以确定它是成功还是错误并相应地完成Meteor调用,则可以尝试使用Meteor.wrapAsync()
。
顺便说一句,如果您确实使用同步任务来实际等待远程服务,您可能会对this.unblock()
感兴趣,以允许您的服务器处理其他任务(方法),而不仅仅是空转。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.