2016-05-16 17 views
6

Sto eseguendo NodeJS e pg-promise con un backend PostgreSQL. Ho creato il mio TRIGGER che genera un'eccezione in alcuni casi. Le cose funzionano bene a questo scopo.NodeJS e pg-promise, intercettano le eccezioni PostgreSQL

Ma con pg-promise non riesco a individuare il nome dell'errore.

utilizzando questo codice:

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

sto ottenendo il seguente output:

[ { 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' } } ] 

posso vedere il nome di 'vote_limit_exceeded' nel contesto, ma come faccio a tornare come un testo stringa?

Ho cercato di ottenere "chiude" con:

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

Ma io non sono in grado di ottenere il 'vote_limit_exceeded' isolato.

risposta

4

Questa è la presentazione di errore standard di PostgreSQL, che ha la proprietà invisibile message, quindi chiamare error.message darà il risultato previsto.

ancora migliore è quello di registrare i vostri errori come questo:

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

estensione sul tuo esempio di codice ...

Sembra che la tua contesto errore deriva dal risultato della chiamata batch funzione. Ciò significa che in tale contesto è anche possibile chiamare error.getErrors()[0] per ottenere il primo errore rilevato.

Quindi per il vostro caso specifico, un errore di registrazione sicura sarebbe:

.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); 
}); 

E naturalmente si può facilmente cambiare a registrare tutti gli errori restituiti dal metodo batch invece.

Questa domanda mi ha dato un'idea sull'aggiunta della proprietà message al risultato di rifiuto. C'è sempre un margine di miglioramento;)

UPDATE

A seguito di questo, ho aggiornato spex.batch rifiutano implementazione per supportare le proprietà first e message, per la gestione degli errori più semplice, e rilasciato come versione 0.4.3. L'implementazione è persino migliore di quanto inizialmente previsto, poiché sia ​​il supporto first e message supportano i risultati nidificati batch.

Se si aggiorna alla versione 4.1.10 pg-promise (o successiva), quindi è possibile accedere tali errori in modo generico:

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

Sarà sempre registrare il messaggio di errore corretto, anche quando l'errore viene da una chiamata nidificata batch.

+1

Nessun altro commento che grazie - wow! :) –