2016-04-21 5 views
0

Ich benutze Nodejs in meinem Windows-Rechner. die Frage ist, dass Nodejs den Prozess immer auf Fehler z. leere Mysql-Anweisung einfügen.Nodejs bei Fehler verlassen, sollte nicht verhindern oder nicht?

Also wie in der Produktionszeit, und ohne manuelle Fehlerbehandlung, wie kann verhindern, NodeJs beenden?

Beispielcode:

app.post('/api/accounts',function(req,res){ 
pool.getConnection(function(error,connection){ 
    connection.query('insert into accounts set ?',req.body,function(err,results){ 
    if (err) { 
    throw err ; 
    } else { 
    console.log(results) ; 
    } 
    }); 
}); 
console.log('post received') ; 
console.log(req.body); 
}); 

stelle ich mir einen leeren req.body posten. NodeJS wird auf Fehler verlassen wie diese

\node_modules\mysql\lib\protocol\Parser.js:77 
    throw err; // Rethrow non-MySQL errors 
    ^

Ist es möglich, etwas in Knoten zu konfigurieren, dass nur Fehler zeigen, aber nicht beenden?

+0

Zeigen Sie uns ein Beispielcode, der das tut, wovon Sie sprechen. –

+0

@John Zwinck: Ich habe den Beitrag aktualisiert, danke für die Aufmerksamkeit –

Antwort

2

Es ist nicht wirklich eine gute Sache vom Interpreter geworfen wurde fort Ausführung nach einer nicht behandelte Ausnahme wird (wie Ginden sagte in seiner Antwort) - alles passieren könnte, und es könnte später ein Fehler erweisen, Jede Art von Loch könnte leicht geöffnet werden, indem der Vorgang gestoppt wird, nachdem etwas in Ihrem Code so unerwartet falsch gelaufen ist.

Sie könnten vernünftig einen Event-Handler für unhandledException wie die Antwort hinzufügen von Ginden weist darauf hin, aber es scheint, Sie verwenden Express und es würde viel mehr Sinn tatsächlich den Fehler mit Middleware Handhabung machen, wenn es passiert, anstatt Verwenden von throw nach Ihrem Code.

Ersetzen throw err; mit return next(err); und das sollte bedeuten, dass die Anfrage durch die nächste Gruppe von Middleware fallen wird, die dann den Fehler behandeln sollte, einige Protokollierung, sagen Sie dem Benutzer, was auch immer Sie es tun möchten.

app.use(function(err, req, res, next) { 
    // Maybe log the error for later reference? 
    // If this is development, maybe show the stack here in this response? 
    res.status(err.status || 500); 
    res.send({ 
     'message': err.message 
    }); 
}); 
+0

Es war eigentlich ich wollte wissen, also habe ich gelernt, wie verhindern, mit der nächsten Verwendung stoppen ..., Vielen Dank viel –

0

Versuchen Sie nicht, das Herunterfahren des Prozesses zu verhindern. Wenn ein Fehler ausgelöst wurde, könnte irgendetwas passieren.

Warning: Using 'uncaughtException' correctly

Beachten Sie, dass ‚uncaughtException‘ ist ein grober Mechanismus für die Ausnahmebehandlung sollte nur als letztes Mittel eingesetzt werden. Das Ereignis sollte nicht als äquivalent zu On Error Resume Next verwendet werden. Nicht behandelte Ausnahmen bedeuten inhärent, dass sich eine Anwendung in einem undefinierten Status befindet. Der Versuch, den Anwendungscode fortzusetzen, ohne die Ausnahme ordnungsgemäß wiederherzustellen, kann weitere unvorhergesehene und unvorhersehbare Probleme verursachen. Ausnahmen, die innerhalb des Ereignishandlers ausgelöst werden, werden nicht abgefangen. Stattdessen wird der Prozess mit einem Exit-Code ungleich Null beendet und der Stack-Trace wird gedruckt. Dies dient dazu, eine unendliche Rekursion zu vermeiden. Der Versuch, nach einer nicht abgefangenen Ausnahme normal fortzufahren, kann ähnlich sein wie das Herausziehen des Netzkabels beim Aktualisieren eines Computers - neun von zehn Malen passiert nichts -, aber zum zehnten Mal wird das System beschädigt.

Domain module: don't ignore errors.

Durch die Art, wie throw arbeitet in JavaScript, gibt es so gut wie nie eine Möglichkeit, um sicher „abholen, wo Sie aufgehört haben“, ohne Referenzen undicht ist, oder eine andere Art von undefinierten spröden Zustand zu schaffen. Der sicherste Weg, um auf einen geworfenen Fehler zu reagieren, ist das Herunterfahren des Prozesses. Natürlich sind auf einem normalen Webserver viele Verbindungen offen, und es ist nicht sinnvoll, diese abrupt zu schließen, weil ein Fehler von jemand anderem ausgelöst wurde. Der bessere Ansatz besteht darin, eine Fehlerantwort an die Anfrage zu senden, die den Fehler ausgelöst hat, während die anderen die normale Zeit beenden und nicht mehr auf neue Anforderungen in diesem Worker warten.

Verwandte Themen