2016-09-12 2 views
2

fields ist im folgenden Code nicht definiert, aber es wird nicht in der Konsole protokolliert, wenn der Fehler auftritt. In diesem speziellen Fall, warum, und was ist der De-facto-Weg, damit umzugehen?JavaScript-Fehler werden nicht in der Konsole angezeigt?

"Testing" wird in der Konsole protokolliert (Zeile # 2), aber die undefinierte Variable fields (Zeile # 4) wird nicht gemeldet. Der Fehler wird in einer API-Antwort (Zeile 5) zurückgegeben, aber ohne relevante Informationen wie Zeilennummer, Stack-Trace usw.

Wie kann ich Fehler wie dieses Protokoll auf der Konsole machen, und warum sind sie nicht?

export function post(req, res) { 
    console.log("Testing") 
    User.create(getFields(req, ["name_first", "name_last"])) 
    .then(user => respondJSON (res, fields, { status: 201 })) 
    .catch(err => respondError (res, err)) 
} 

Da der Fang mit einem Fehler reagiert, erhalte ich die folgende API-Antwort:

{ 
    "error": true, 
    "data": { 
    "message": "fields is not defined" 
    } 
} 

Ich bin mit Babel 6 und babel-Knoten meinen Code durch NPM-Skripte ausführen. Ich benutze auch Morgan Logging. Durch das Entfernen der Middleware für die Protokollierung wird die Fehlerausgabe nicht geändert.

+0

Fehler tun, die in Versprechungen passieren nicht an die Konsole propagieren? Wenn ich zum Beispiel "console.log (x)" in die Chrome-Konsole eintippe, bekomme ich "Uncaught ReferenceError: x ist nicht definiert" und einen Stack-Trace. – Connorelsea

+0

Mögliches Duplikat von [Warum kann ich nicht in einen Promise.catch-Handler werfen?] (Http://stackoverflow.com/questions/30715367/why-can-i-not-throw-inside-a-promise-catch-handler) – jib

Antwort

6

Die automatische Protokollierung der Konsole ist ein Mechanismus für unhandled Ausnahmen. Da Promises in den Callbacks automatisch Ausnahmen abfangen, werden die Ausnahmen nicht mehr behandelt, sodass nichts automatisch protokolliert wird.

Wenn Sie möchten, dass es geloggt wird, könnten Sie am Ende Ihres catch-Blocks vielleicht eine throw err hinzufügen. Dadurch wird es in eine nicht behandelte Verweigerungsverweigerung konvertiert, die normalerweise ähnlich wie eine unbehandelte Ausnahme behandelt wird.

+0

Jetzt sehe ich einige der Probleme, die Leute mit Versprechungen haben. Das ist irgendwie scheiße. Danke für die Erklärung. – Connorelsea

+0

Der zweite Teil der Antwort ist falsch. Das Einwerfen von 'catch' beeinflusst nichts. Es wird möglicherweise in den neuesten Chrome-Versionen als Fehler "nicht abgefangenes Versprechen" aufgeführt, aber nicht als native systemeigene Versprechen. – estus

+2

@estus Sie müssen erneut werfen, damit es als "unbehandelte Ablehnung" betrachtet wird. Um sich jedoch an einem beliebigen Ort einzuloggen, muss Ihre Anwendung sie auch manuell protokollieren. Chrome macht es automatisch, Knoten tut es nicht: https://nodejs.org/api/process.html#process_event_unhandledrejection – loganfsmyth

1

Weil Sie den Fehler eigentlich nicht protokolliert haben?

export function post(req, res) { 
    console.log("Testing") 
    User.create(getFields(req, ["name_first", "name_last"])) 
    .then(user => respondJSON (res, fields, { status: 201 })) 
    .catch(err => { 
     console.error(err); 
     respondError(res, err); 
    }); 
} 
+0

Ja, ich verstehe das, aber werden Fehler wie diese nicht nur als Fehler angezeigt? Wenn ich einfach "console.log (x)" in die Chrome-Konsole eintippe, bekomme ich "Uncaught ReferenceError: x ist nicht definiert" und einen Stack-Trace. – Connorelsea

0

Ich hatte ein ähnliches Problem, verursacht durch eine 'schließlich', die an die Haupt-Async-Funktion angehängt wurde.

run() 
.finally(()=>{process.exit(0)}) 

Modifizieren Sie es an:

run() 
.catch(err => {console.log(err)}) 
.finally(()=>{process.exit(0)}) 

löste das Problem

Verwandte Themen