2016-05-16 56 views
6

我正在使用PostgreSQL後端運行NodeJS和pg-promise。 我創建了自己的TRIGGER,在某些情況下會引發異常。事情在這方面很好。NodeJS和pg-promise,捕獲PostgreSQL異常

但是,pg-promise我無法捕獲錯誤的名稱。

使用此代碼:

... 
.catch(function(err) { 
    console.log(err); 
}); 

我得到以下輸出:

[ { success: false, 
result: 
{ [error: vote_limit_exceeded] 
    name: 'error', 
    length: 80, 
    severity: 'ERROR', 
    code: 'P0001', 
    detail: undefined, 
    hint: undefined, 
    position: undefined, 
    internalPosition: undefined, 
    internalQuery: undefined, 
    where: undefined, 
    schema: undefined, 
    table: undefined, 
    column: undefined, 
    dataType: undefined, 
    constraint: undefined, 
    file: 'pl_exec.c', 
    line: '3068', 
    routine: 'exec_stmt_raise' } } ] 

我可以看到在上下文「vote_limit_exceeded」的名字,但我怎麼回的文本串?

我試過越來越「親密」有:

console.log(err[0].result); 

但我沒能得到「vote_limit_exceeded」隔離。

回答

4

這是PostgreSQL的標準錯誤呈現,它有不可見的屬性message,所以調用error.message會給你預期的結果。

最好的是是登錄你的錯誤是這樣的:

console.log(error.message || error); 

在你的代碼示例擴展...

它看起來像你的錯誤上下文來自調用batch函數的結果。這意味着在這種情況下,您還可以致電error.getErrors()[0]獲取找到的第一個錯誤。

因此,對於您的特定情況下,一個安全的錯誤記錄是:

.catch(error => { 
    if (Array.isArray(error) && 'getErrors' in error) { 
     // the error came from method `batch`; 
     // let's log the very first error: 
     error = error.getErrors()[0]; 
    } 
    console.log("ERROR:", error.message || error); 
}); 

當然,你可以很容易地改變它,可記錄方法batch而是返回的所有錯誤。

這個問題給了我一個關於添加屬性message到拒絕結果的想法。總是有改進的餘地;)

UPDATE

在此之後,我更新spex.batch拒絕實施支持性firstmessage,更容易錯誤處理,並釋放0.4.3版本。這個實現甚至比我最初想要的要好,因爲firstmessage都支持嵌套的batch結果。

如果更新pg-promise到4.1.10版本(或更高版本),那麼您可以在一個通用的方式記錄這些錯誤:

.catch(error => { 
    console.log("ERROR:", error.message || error); 
}); 

它將隨時登錄正確的錯誤消息,甚至當錯誤出現來自嵌套的batch呼叫。

+1

沒有其他評論比謝謝 - 哇! :) –