2016-05-16 11 views
6

Ich leite NodeJS und pg-Versprechen mit einem PostgreSQL-Backend. Ich habe meinen eigenen TRIGGER erstellt, der in einigen Fällen eine Ausnahme auslöst. An diesem Ende läuft alles gut.NodeJS und pg-promise, fangen PostgreSQL-Ausnahmen

Aber mit pg-versprechen habe ich Probleme, den Namen des Fehlers zu fangen.

Mit diesem Code:

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

Ich erhalte die folgende Ausgabe:

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

ich den Namen sehen kann 'vote_limit_exceeded' im Zusammenhang, aber wie komme ich als Text Schnur?

Ich habe versucht, "close" mit bekommen:

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

Aber ich bin nicht in der Lage die 'vote_limit_exceeded' isoliert zu bekommen.

Antwort

4

Dies ist die Standardfehlerpräsentation von PostgreSQL, die die unsichtbare Eigenschaft message hat. Wenn Sie also error.message aufrufen, erhalten Sie das erwartete Ergebnis.

Beste noch Ihre Fehler wie diese zu protokollieren:

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

auf Ihrem Codebeispiel erweitern ...

Es sieht aus wie Ihre Fehlerkontext des Aufrufs batch Funktion aus dem Ergebnis kommt. Das bedeutet in diesem Kontext können Sie auch error.getErrors()[0] aufrufen, um den allerersten Fehler zu finden.

Also für Ihren speziellen Fall, eine sichere Fehlerprotokollierung wäre:

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

Und natürlich können Sie leicht ändern batch stattdessen alle Fehler zurückgegeben nach der Methode zu protokollieren.

Diese Frage gab mir eine Idee über das Hinzufügen der Eigenschaft message zum Zurückweisungsergebnis. Es gibt immer Raum für Verbesserungen;)

UPDATE

Im Anschluss daran I aktualisiert spex.batch Umsetzung ablehnen Eigenschaften unterstützen first und message zur einfacheren Fehlerbehandlung und veröffentlichte es als Version 0.4.3. Die Implementierung ist sogar noch besser als ursprünglich geplant, da sowohl first als auch message verschachtelte Ergebnisse unterstützen.

Wenn Sie pg-promise auf Version 4.1.10 (oder höher) aktualisieren, können Sie solche Fehler in allgemeiner Weise protokollieren:

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

Es wird immer die Meldung korrekt Fehler protokollieren, auch wenn der Fehler kommt von einem verschachtelten batch Aufruf.

+1

Kein anderer Kommentar als danke - wow! :) –