繁体   English   中英

投掷Meteor.Error未到达客户端

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM