抛出Meteor.Error没有到达客户端

时间:2016-08-01 03:27:30

标签: meteor

基本上,客户端使用Meteor.call来调用服务器。然后,服务器方法执行一些验证并使用meteor包调用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 仅在服务器上登录。

1 个答案:

答案 0 :(得分:1)

我猜你的package.callService()是异步的(假设它接受回调)。

在这种情况下,您的Meteor方法启动异步任务,然后继续其进程并返回(因为没有更多指示),而异步任务仍在运行(实际上正在等待远程Web服务的响应)。因此,您的客户端Meteor调用的回调会收到“无错误”响应。

一旦发生“错误2”,Meteor调用已经完成,错误只能记录在服务器上。

如果您想“挂断”您的方法,以便等待package.callService()的结果确定它是成功还是错误并相应地完成Meteor调用,您可以尝试使用{{ 3}}

顺便说一句,如果你确实使用同步任务来实际等待远程服务,你会感兴趣的是Meteor.wrapAsync()允许你的服务器处理其他任务(方法)而不是空闲。