2016-03-15 4 views
5

Ich habe eine NodeJS-App mit Express 4, Mongoose und MongoDB ausgeführt. Dann bekam ich eine mögliche Bot-GET-Anfrage, auf die die Antwort 404 war. Normalerweise macht die App danach kein Problem, aber diesmal sah es so aus, als wäre sie eingefroren oder zum Stillstand gekommen. Und in meinem Browser würde keine Seite geladen, obwohl die App technisch noch läuft. Nach dem Neustart wurde es wieder normal.Wie kann sichergestellt werden, dass NodeJS nach fehlerhaften Anforderungen wiederhergestellt wird?

Nach testproxy.php würde es nur halb leere Zeilen emittieren.

Ich weiß, es gibt für immer Modul, das Ihre App neu starten würde, wenn es abstürzt, nicht sicher, es wäre in diesem Fall hilfreich gewesen.

enter image description here

EDIT:

In meinem app.js (I in dev-Modus war):

app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

Es sollte 500 Fehler gedruckt haben, aber es hat nicht, weil es dachte, dass es den 404 Fehler behandelte und ich glaube nicht, dass als nächstes (err) in diesem Fall gefeuert wurde.

+0

immer Modul sehr nützlich, wenn Sie einen unerwarteten Fehler haben, können so immer neu starten, die node.js. Über die Get ohne Antwort, manchmal habe ich das gleiche Problem in meiner Anwendung, ich muss nur die Seite (Browser) neu laden und alles wieder normal. Ich würde gerne wissen, warum das manchmal passiert. – danilodeveloper

+0

Gute Frage, warum es passiert. –

Antwort

1

Normalerweise zu beheben, dass Sie wirklich müssen einige Vordergrund (z. B. nodemon) oder Hintergrund (z. B. forever) Daemon-Prozess, die darauf achten, dass Ihr Server abstürzt und starten Sie Ihre Knoten Instanz.

Die andere wichtige Sache, die Sie beachten müssen, ist, den Prozess zu beenden, sobald er nicht definiert ist.

Zum Beispiel könnten Sie folgende Middleware hinzufügen:

var serverProcess; 

app.use(function(err, req, res, next) { 
    // regular errors handler here 
    // process further middleware if error can't be handled in the correct way 
    next(err);  
}); 

app.use(function(err, req, res, next) {  
    // close request connection 
    req.connection.end(); 

    // stop server process 
    serverProcess.close(function() {  
    //An unhandled exception means your application is in an undefined state. 
    //Blindly resuming means anything could happen. 
    process.exit(1); 
    });  
}); 

serverProcess = http.listen(httpPort, callback); 

Sie andere Logik Ihr Prozess für das Töten zur Verfügung stellen kann, aber bedenken Sie, dass etwas außerhalb der Anwendung dieser Situation umgehen sollte und den Server neu starten richtig.

+1

Vielen Dank, ich habe meine Frage bearbeitet. –

+0

@ ed-ta du bist willkommen;) –

0

Nach dem Experimentieren und Forschung stellt sich heraus, dies:

GET/-- ms -- 
GET/-- ms -- 

passiert, wenn die App Verbindung zu MongoDB verliert (duh). Nur in meinem Fall passierte die schlechte Anfrage und die verlustende db-Verbindung zur gleichen Zeit zufällig.

ich Mongoose bin mit, so was getan werden kann, ist db Neustart und App-Neustart-Logik innerhalb des Callback hinzuzufügen:

mongoose.connection.on('disconnected', function() { 
    console.log('Mongoose default connection disconnected'); 
}); 
Verwandte Themen