Meine node.js-App ist wie die express / examples / mvc- App modelliert .
In einer Controller-Aktion möchte ich einen HTTP 400-Status mit einer benutzerdefinierten http-Nachricht ausspucken. Standardmäßig lautet die http-Statusmeldung "Bad Request": Bad Request:
HTTP/1.1 400 Bad Request
Aber ich möchte senden
HTTP/1.1 400 Current password does not match
Ich habe verschiedene Methoden ausprobiert, aber keine davon hat die http-Statusnachricht auf meine benutzerdefinierte Nachricht gesetzt.
Meine aktuelle Solution Controller-Funktion sieht folgendermaßen aus:
exports.check = function( req, res) {
if( req.param( 'val')!=='testme') {
res.writeHead( 400, 'Current password does not match', {'content-type' : 'text/plain'});
res.end( 'Current value does not match');
return;
}
// ...
}
Alles funktioniert gut, aber ... es scheint nicht der richtige Weg zu sein.
Gibt es eine bessere Möglichkeit, die http-Statusmeldung mit Express festzulegen?
Antworten:
Sie können diese
res.send(400, 'Current password does not match')
Look Express 3.x-Dokumente auf Details überprüfenUPDATE für Expressjs 4.x.
Verwenden Sie diese Methode (siehe Express 4.x-Dokumente ):
quelle
res.status(400).send('Current password does not match');
Beispiel funktioniert für mich für Express 4.Express ^4.16.2
Keine der vorhandenen Antworten erfüllt das, was das OP ursprünglich verlangt hatte, nämlich die von Express gesendete Standard -Grundphrase (der Text, der unmittelbar nach dem Statuscode erscheint) zu überschreiben .
Was du willst ist
res.statusMessage
. Dies ist nicht Teil von Express, sondern eine Eigenschaft des zugrunde liegenden http.Response-Objekts in Node.js 0.11+.Sie können es folgendermaßen verwenden (getestet in Express 4.x):
Verwenden Sie dann, um
curl
zu überprüfen, ob es funktioniert:quelle
statusMessage
Nachricht auf etwas anderes als die Standardnachricht zu setzen, die dem StatusCode zugeordnet istres.nativeResponse.statusMessage
Auf der Serverseite (Express Middleware):
Auf Kundenseite handhaben
Winkel: -
jQuery: -
quelle
Eine elegante Möglichkeit, solche benutzerdefinierten Fehler in Express zu behandeln, ist:
(Sie können hierfür auch den in express integrierten Express.errorHandler verwenden. )
Dann in Ihrer Middleware vor Ihren Routen:
Wo möchten Sie dann den Fehler "Aktuelles Passwort stimmt nicht überein" erstellen:
quelle
Sie können es so verwenden
quelle
Mein Anwendungsfall ist das Senden einer benutzerdefinierten JSON-Fehlermeldung, da ich Express verwende, um meine REST-API mit Strom zu versorgen. Ich denke, dies ist ein ziemlich häufiges Szenario, daher werde ich mich in meiner Antwort darauf konzentrieren.
Kurzfassung:
Express-Fehlerbehandlung
Erhöhen Sie Fehler an einer beliebigen Stelle im Code, indem Sie Folgendes tun:
Lange Version
Die kanonische Art, Fehler zu werfen, ist:
Standardmäßig behandelt Express dies, indem es es ordentlich als HTTP-Antwort mit Code 404 verpackt und einen Text enthält, der aus der Nachrichtenzeichenfolge besteht, an die ein Stack-Trace angehängt ist.
Dies funktioniert bei mir nicht, wenn ich beispielsweise Express als REST-Server verwende. Ich möchte, dass der Fehler als JSON und nicht als HTML zurückgesendet wird. Ich möchte auch definitiv nicht, dass mein Stack-Trace auf meinen Client übertragen wird.
Ich kann JSON als Antwort senden
req.json()
, z. so etwas wiereq.json({ status: 404, message: 'Uh oh! Can't find something'})
. Optional kann ich den Statuscode mit einstellenreq.status()
. Kombination der beiden:Das funktioniert wie ein Zauber. Trotzdem finde ich es ziemlich unhandlich, jedes Mal zu tippen, wenn ich einen Fehler habe, und der Code ist nicht mehr so selbstdokumentierend wie unser Code
next(err)
. Es sieht viel zu ähnlich aus, wie eine normale (dh gültige) Antwort JSON gesendet wird. Darüber hinaus führen alle Fehler, die durch den kanonischen Ansatz ausgelöst werden, immer noch zu einer HTML-Ausgabe.Hier kommt die Fehlerbehandlungs-Middleware von Express ins Spiel. Als Teil meiner Routen definiere ich:
Ich habe auch Fehler in eine benutzerdefinierte JSONError-Klasse unterteilt:
Wenn ich jetzt einen Fehler in den Code werfen möchte, mache ich:
Zurück zur benutzerdefinierten Middleware zur Fehlerbehandlung ändere ich sie wie folgt:
Das Unterklassifizieren von Fehlern in JSONError ist wichtig, da Express vermutlich
instanceof Error
den ersten an a übergebenen Parameter überprüft,next()
um festzustellen, ob ein normaler Handler oder ein Fehlerhandler aufgerufen werden muss. Ich kann dieinstanceof JSONError
Prüfung entfernen und geringfügige Änderungen vornehmen, um sicherzustellen, dass unerwartete Fehler (z. B. ein Absturz) auch eine JSON-Antwort zurückgeben.quelle
Bei Verwendung von Axios können Sie die benutzerdefinierte Antwortnachricht abrufen mit:
... nach dem Einstellen in Express als:
quelle
Wenn Ihr Ziel nur darin besteht, es auf eine einzelne / einfache Zeile zu reduzieren, können Sie sich ein wenig auf die Standardeinstellungen verlassen ...
quelle
Nun, im Fall von Restify sollten wir die
sendRaw()
Methode verwendenDie Syntax lautet:
res.sendRaw(200, 'Operation was Successful', <some Header Data> or null)
quelle