2016-08-01 47 views
0

因此,基本上,客戶端使用Meteor.call來調用服務器。服務器方法然後進行一些驗證並使用流星包調用Web服務。如果驗證失敗並拋出流星錯誤,則它會到達服務器。如果程序包響應有錯誤,它只會在服務器上登錄。我需要將錯誤傳達給客戶。投擲Meteor.Error沒有到達客戶端

下面是代碼的樣子。

客戶

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

我想你的package.callService()是異步的(假設它接受回調)。在這種情況下,您的Meteor方法啓動異步任務,然後繼續其進程並返回(因爲沒有更多指令),而異步任務仍在運行(實際上正在等待來自遠程Web服務的響應) 。因此,您的客戶端Meteor調用的回調會收到「無錯」響應。

一旦你的「錯誤2」發生,流星調用已經完成,錯誤只能記錄在服務器上。

如果您想「掛斷」您的方法,以便它等待package.callService()的結果以確定它是成功還是錯誤並相應地完成流星調用,則可以嘗試使用Meteor.wrapAsync()。順便說一下,如果您確實使用同步任務來實際等待遠程服務,那麼您會對this.unblock()感興趣,以允許您的服務器處理其他任務(方法),而不僅僅是空閒。

+0

情況完全如此。我很抱歉,我完全忘記將此標記爲已接受 – nupac