Qual è il metodo standard di gestione degli errori in un'app Web NodeJS?

3

Attualmente sto lavorando a un'applicazione web come progetto di apprendimento, che ha un backend NodeJS e usa un database MongoDB; tuttavia, credo che la mia domanda non sia specifica per le tecnologie che sto usando.

Quando creo un'API RESTful, posso apprezzare che devi sempre rispondere al client con il codice di errore HTTP appropriato ogni volta che il tuo programma incontra un errore durante l'esecuzione (es. rispondi con qualche codice di errore HTTP quando MongoDB incontra un problema che prova a recuperare alcuni dati e fornire un feedback di front end sull'errore). Ad esempio, quando si crea una voce in un database MongoDB, in genere si esegue quanto segue

Model.create({
            // create some data in my db
        }, (err, data) => {
            if (err) {
                // respond with 404
            } else {
                // respond with 200 and serve data to client
            }
        })

Tuttavia, non sono sicuro su come dovrei gestire gli errori nelle istanze al di fuori di quanto sopra. Ad esempio, per il codice che viene eseguito su un intervallo regolare non richiesto da un client, cosa dovrei fare con l'errore dato che mi aspetto che questo codice di routine funzioni senza intoppi continuamente?

La pratica ingegneristica standard prevede l'invio di un avviso quando viene generato un errore? La mia soluzione attuale è semplicemente console.log l'errore che sembra del tutto inutile dato che non guarderei il mio server 24 ore su 24, 7 giorni su 7, quindi qualsiasi errore registrato sarebbe passato inosservato.

Model.create({
            // create some data in my db
        }, (err, data) => {
            if (err) {
                // what should I do here??
                // currently pointlessly console.logging here...
            } else {
                // do something on success
            }
        })

Di seguito c'è un'altra istanza in cui non sono sicuro di come gestire l'errore. Qui, sto inviando una notifica allentata ogni volta che succede qualcosa per monitorare la mia applicazione e mi aspetto che funzioni sempre. Se un messaggio non riesce a inviare, non è un grosso problema, ma cosa faccio con l'errore?

slack.webhook({ // posts message to slack
        channel: "#general",
        username: "bot",
        text: 'Yay success'
    }, function(err, response) {
        // what should I do if the slack message doesn't send??
        // Send an alert to tell me that there is an issue with sending messages to slack? 
        // Force the app to keep trying to resend a message until it's successful?
    });
    
posta user5814 29.03.2018 - 12:31
fonte

1 risposta

2

Quindi, non c'è un modo standard di cui sono a conoscenza, ma nella mia esperienza dirò cosa è comune nella produzione.

In generale, hai due tipi di errori: cose su cui gli amministratori devono effettivamente agire e su cui gli utenti devono intervenire.

In HTTP land, i primi sono errori 500 series e gli ultimi sono 400 series (in generale, ci sono eccezioni, se perdonerai il gioco di parole)

Innanzitutto, qualsiasi errore HTTP può e deve essere gestito dal middleware. Quindi ogni gestore di richieste può semplicemente chiamare next (err) e quindi puoi usare un middleware come praeter (full disclosure: ho scritto quello) per capire quale codice di risposta HTTP usare, ecc. Qualsiasi errore di admin-action può anche essere registrato stderr. (console.err () a meno che tu non stia utilizzando Winston o simili)

In secondo luogo, sì, il modo migliore (imo) per gestire altri errori e avvisi è attraverso la registrazione. Quindi usa un framework di registrazione o comandi di console, ma credo che dovrebbe andare tutti a stdout e stderr. Perché? Bene, questo è il modo più portatile, manutenibile, semplice e conforme agli standard.

E gli amministratori che devono controllare i log, chiedi? Bene, credo in ogni pezzo di software che fa bene una serie di cose. La tua app Web non è principalmente uno strumento di amministrazione, quindi non provare a fare cose specifiche per supportare la propria manutenzione. Configurare invece un aggregatore di registri come ElasticStack o utilizzare un servizio come Loggly. Quelli possono sia analizzare i registri che inviarti notifiche se qualcosa non va. New Relic è un altro buon servizio per monitorare lo stato della tua app e ce ne sono altri. Scegli quello che si adatta al tuo punto di prezzo (molti hanno livelli gratuiti) se non vuoi ospitare il tuo.

    
risposta data 29.03.2018 - 15:04
fonte