基本上,客户端使用 Meteor.call
调用服务器。然后,服务器方法会进行一些验证并使用 Meteor 包调用 Web 服务。如果验证失败并引发 meteor 错误,则会到达服务器。如果包响应有错误,则仅记录到服务器上。我需要错误才能到达客户端。
代码如下所示。
客户端
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 方法将启动异步任务,然后继续其进程并返回(因为没有更多指令),而异步任务仍在运行(实际上正在等待远程 Web 服务的响应)。因此,您的客户端 Meteor 调用的回调会收到“无错误”响应。
一旦发生“错误2”,Meteor调用就已经完成,错误只能记录在服务器上。
如果您想“挂起”您的方法,以便它等待 package.callService()
的结果来确定它是成功还是错误,并相应地完成 Meteor 调用,您可以尝试使用 Meteor.wrapAsync()
.
顺便说一句,如果您确实使用同步任务来实际等待远程服务,您会对 this.unblock()
感兴趣。允许您的服务器处理其他任务(方法),而不仅仅是闲置。
关于meteor - 抛出 Meteor.Error 未到达客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690574/