2017-07-10 20 views
0

我有這樣的:Meteor.Error在拋出給客戶端時會改變嗎?

Meteor.methods({ 
    'foo'() { 
    try{ 
     ...//some http.get 
    } catch (e) { 
     console.log(e); //-> { [Error: ETIMEDOUT] code: 'ETIMEDOUT', connect: true } 
     if(e.code === 'ETIMEDOUT') { throw e; } 
    } 
    } 
}); 

所以現在我在客戶端:

Meteor.call('foo', function(error, result) { 
    if(error){ 
    if(error.code === 'ETIMEDOUT') { 
     //this block is never reached.. why? 
    } 
    } 
} 

但似乎error.code是不一樣的服務器上(這好像它被改爲內部服務器錯誤)。爲什麼是這樣?更重要的是,我怎樣才能得到我原來的(在這種情況下超時)錯誤?

+0

在第二個區塊中,您有拼寫錯誤 - 「ETIMEDOUD」。是嗎? – Sindis

+0

不幸的是,這是SO上的一個錯字。但thx反正(固定)。 – Gobliins

+0

在foo()方法中,您有一個賦值而不是compare('='),順便說一句。這不會導致你的問題,但檢查你的實際代碼。 – zim

回答

2

manual

當你有沒有需要報告給客戶端, 但內部服務器錯誤,拋出一個常規的JavaScript錯誤 對象。這將作爲一個完全不透明的 內部服務器錯誤報告給客戶端,沒有詳細信息。

這就是你所看到的。相反:

當服務器是無法完成的,因爲已知條件的用戶所需的操作 ,你應該拋出一個描述 Meteor.Error對象給客戶端。 Meteor.Error有三個參數:錯誤,原因和細節。

所以你可能會做這樣的事情:

if (e.code === 'ETIMEDOUT') { 
    let userMessage = 'The remote call timed out.'; 
    let detail = `${userMessage}: ${JSON.stringify(e)}`; 
    console.error(detail); 
    throw new Meteor.Error('remote-call-timed-out', userMessage, detail); 
} 

第一個參數,「錯誤」(我稱之爲「碼」),是你可以設定對客戶端採取一個特定的行動或使用戶信息國際化。這就是我們在我們的系統中所做的。 (如果找不到代碼,我們將顯示userMessage)。詳細信息被寫入服務器日誌並放入瀏覽器console.log中。

+0

這實際上是我對這個問題的解決方法。 – Gobliins

相關問題