Fehlerbehandlung wird nach all Ihren anderen Routen deklariert. Express bewegt sich durch Routen von oben nach unten oder von links nach rechts (wenn Sie sich Ihren Code in einer Zeile vorstellen).
Sie können dies ausnutzen, indem Sie eine Splat-Route nach all Ihren anderen Routen einfügen, und sie wird aktiviert, wenn keine andere exakte Route übereinstimmt. So können Sie eine Fehler 404-Seite erstellen.
Es ist, warum Sie Ihre Routen wie diese bauen (die Sie vorbereiten für Router ‚Schalterkomponente‘ Reaktion, wenn Sie in React Codierung bewegen):
GET /test/:slug
GET /test
GET/
Hier ein Beispiel für eine Splat Route ist und folgende dass Ihre Fehlerhandler Middleware:
// Try switching the order of these first two
app.get('/', async (req, res, next) => {
return res.status(200).send('test')
})
app.get('*', async (req, res, next) => {
return res.status(404).send('error 404') // res.render('error/404')
})
// ERRORS
app.use(async (err, req, res, next) => {
// if next() is called with a parameter, which can be anything,
// this middleware will fire
res.status(500).send('error 500') // res.render('error/500')
throw err
})
// Try replacing your default route with this now
app.get('/', async (req, res, next) => {
return next('Extreme detonations')
})
Sie brauchen nicht die Asynchron-Funktionen, wie ich hier gezeigt habe, aber ich habe es als eine Frage der Konvention, so kann ich immer await
dort schlagen. Ich verwende explizite Returns, um Probleme beim Senden von Headern zu vermeiden, nachdem sie bereits gesendet wurden, und weil Async-Funktionen Versprechen versprechen, so dass eine explizite Rückgabe sie auflösen kann. Alle
meine Routen sehen in der Regel wie folgt aus:
app.get('/admin', async (req, res, next) => {
try {
if (!req.user) throw 'garbageUser'
const poop = await something()
return res.render('template', {
data: obj,
bonusData
})
} catch (e) {
if (e === 'garbageUser') {
log.add(`illegal: ${req.originalUrl} from ${sniffer.getClientIp(req)}`)
return res.render('403')
}
return next(e)
}
})
Diese hoffentlich informativ für Sie sein sollte und einige Code bieten forensisch zu analysieren. Die Express-Fehlerbehandler-Middleware nimmt einen vierten Parameter an der ersten Position mit der Bezeichnung err
, der den Wert enthält, der an next()
übergeben wurde.
Schauen Sie sich die Dokumentation Express wieder nach diesem Studium, und es wird viel mehr Sinn machen :)
Um Ihre Frage zu beantworten:
var express = require('express');
var app = express();
// You can add these back now that you understand
// var errorhandler = require('errorhandler');
// var notifier = require('node-notifier');
function handleErrors(error) {
console.log('I'm telling your mom about this: ' + error);
}
app.get('/', function(req, res, next) {
return next('REALLY BAD');
return res.send('this is home page!');
});
// Remember, this must be after all your other routes
app.use(function(err, req, res, next) {
console.log('Problem occurred, we could put logic here...');
console.log('Error was: ' + err);
if (err === 'REALLY BAD') {
handleErrors(err);
}
next();
});
app.listen(1338);
Probieren Sie dies jetzt return next('REALLY BAD');
heraus zu kommentieren und führe es erneut aus. Sie sollten sehen "das ist Homepage!".
Wenn Sie ohne Parameter aufrufen, behandelt Express es als keinen Fehler. Wenn Sie einen Wert übergeben, wie next(err)
oder next('Chicken tastes good')
, sehen Sie err
definiert mit diesem Wert in Ihrer Fehlerbehandlung Middleware.
Sie müssen erklären, was "nicht funktioniert" bedeutet. Welches Verhalten erwarten Sie? Welches Verhalten siehst du? Im Allgemeinen sollte die Middleware zur Fehlerbehandlung zuletzt installiert werden, damit sie bei der Anforderung LETZTE Risse bekommt. Was macht 'nonexist()' auch? Und, warum nennst du 'next()' nachdem du 'res.send()' gemacht hast. Das ist falsch. Sie rufen nur 'next()' auf, wenn Sie möchten, dass mehr Route-Handler oder Middleware die Anforderung verarbeitet. – jfriend00
Probieren Sie diese Variable aus. ErrorHandler = require ('errorhandler'); if ('Entwicklung' == app.get ('env')) { app.use (errorHandler()); } –
Ändern == Operator as === in (process.env.NODE_ENV == 'Entwicklung') –