簡體   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