2017-09-09 1 views
0

Ich habe versucht, Middleware-Fehlerbehandler zu verwenden, aber nicht funktioniert, selbst gesetzt i process.env.NODE_ENV ='development'wie Fehlerbehandler-Middleware in Express 4.x verwenden

unter dem Code-Server ist:

var express = require('express'); 
var app = express(); 
var errorhandler = require('errorhandler'); 
var notifier = require('node-notifier'); 
process.env.NODE_ENV = 'development'; //just purposely do this, see if it can work 
if (process.env.NODE_ENV == 'developmet') { 
    app.use(errorhandler({ log: errorNotification })); 
} 

function errorNotification(err, str, req) { 
    var title = 'Error in' + req.method + '' + req.url; 
    notifier.notify({ 
     title: title, 
     message: str 
    }); 
} 
app.get('/', function (req, res, next) { 
    nonexist(); //the error is still captured Native node.js not errorhandler 
    res.send('this is home page!'); 
    next(); 
}); 
app.listen(1338); 

egal was Art von Optionen, die ich im Fehlerhandler versucht habe, funktioniert es immer noch nicht. kann mir jemand helfen, eine Einstellung zu überprüfen, ist falsch?

+0

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

+0

Probieren Sie diese Variable aus. ErrorHandler = require ('errorhandler'); if ('Entwicklung' == app.get ('env')) { app.use (errorHandler()); } –

+0

Ändern == Operator as === in (process.env.NODE_ENV == 'Entwicklung') –

Antwort

0

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.

+0

danke. aber ich will nur grundlegende Middleware-Fehlerhandler können basierend auf offiziellen Demo arbeiten. und dein Code verwirrt mich mehr mit 'async (req, res, next)'. Ich bin neu in Node.js und Express. –

+0

Hier werde ich ein Beispiel für Sie am Ende der Antwort hinzufügen. Der Teil, der dich verwirrt, ist 'function name() {return 'Sunny'}' ist das gleiche wie 'var name =() => {return 'Sunny'}'. Es ist neuere Syntax. Tut mir leid, ich habe den genauen Lernstand nicht erkannt. Sie sollten auch wissen, dass "const" und "let" im Wesentlichen die gleichen wie "var" sind, aber sie sind expressiver. Const bedeutet Konstante, was bedeutet, dass Sie es nicht neu zuweisen können. Lassen Sie Ihre Absicht ist, möglicherweise den Wert der Variable "mutieren". – agm1984

+0

Ok, sieh es dir jetzt an. Alles nach der gelben Leiste ist neu. – agm1984

Verwandte Themen