2016-03-15 45 views
5

Ero in esecuzione un'app NodeJS con Express 4, Mongoose e MongoDB. Poi ho ricevuto una possibile richiesta GET di bot a cui la risposta era 404. Di solito l'app prosegue senza alcun problema, ma questa volta sembrava bloccata o bloccata. E nessuna pagina verrebbe caricata nel mio browser sebbene l'app fosse ancora tecnicamente in esecuzione. È tornato alla normalità dopo il riavvio.Come assicurarsi che NodeJS recuperi dopo richieste errate?

Dopo testproxy.php, emetterebbe solo linee vuote.

So che c'è sempre un modulo che riavvierebbe la tua app se si blocca, non è sicuro che sarebbe stato utile in questo caso.

enter image description here

EDIT:

Nei miei app.js (ero in modalità dev):

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 
    }); 
    }); 
} 

Si dovrebbe aver stampato 500 errore, ma non ha perché pensavo che gestisse l'errore 404 e non penso che il prossimo (err) sia mai stato licenziato in questo caso.

+0

Sempre modulo è utile quando si dispone di un errore imprevisto, quindi sempre in grado di riavviare il node.js. Informazioni su come ottenere senza risposta, a volte ho lo stesso problema nella mia applicazione, ho solo bisogno di ricaricare la pagina (browser) e tutto torna alla normalità. Mi piacerebbe sapere perché a volte succede. – danilodeveloper

+0

Buona domanda, perché succede. –

risposta

1

In genere per risolvere il problema è necessario disporre di alcuni processi in primo piano (ad es.

L'altra cosa importante che devi fare attenzione è uccidere il processo non appena è in uno stato indefinito.

Per esempio si potrebbe aggiungere seguente middleware:

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); 

è possibile fornire qualsiasi altra logica per uccidere il processo, ma tenere a mente che qualcosa al di fuori l'applicazione deve gestire questa situazione e riavviare il server in modo corretto.

+1

Grazie, ho aggiunto una modifica alla mia domanda. –

+0

@ ed-ta sei il benvenuto;) –

0

Dopo la sperimentazione e la ricerca si scopre questo:

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

accade quando l'applicazione perde la connessione a MongoDB (duh). Solo nel mio caso la cattiva richiesta e la perdita della connessione db sono avvenute allo stesso tempo, accidentalmente.

sto usando Mongoose, quindi cosa si può fare è aggiungere il riavvio db e la logica di riavvio app all'interno del callback:

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