2014-12-15 2 views
13

Ho appena iniziato a provare SailsJS alcuni giorni fa.
Mi sono reso conto che il nodo è terminato ogni volta che ho un'eccezione non rilevata.
Ho un elenco di controller e ognuno di essi chiama un file JS di servizio specifico (Contiene logiche e chiamate DB) in servizi /.
Posso scrivere un gestore di errori globale per tutti i servizi in modo che qualsiasi tipo di errore che si verifica da questi servizi debba essere gestito da esso e una risposta all'errore appropriata deve essere comunicata al front-end.Best practice per gestire l'eccezione in SailsJS

Ho provato a utilizzare process.on ('uncaughtexception') o alcune delle eccezioni di base ma è necessario aggiungerlo a ciascun metodo di servizio.

Inoltre posso avere un punto comune per tutte le chiamate di servizio effettuate dal client al server attraverso il quale tutto io.socket.post() e io..socket.get() passa attraverso

Gradirei qualsiasi puntatore/articolo che mi mostrerebbe le migliori pratiche comuni per la gestione delle eccezioni non rilevate in SailsJS e l'uso di codice più breve piuttosto che scrivere codice ridondante in tutti i servizi.

+0

Davvero una buona domanda. Mai pensato prima a questo, ma le policy sono il codice che viene eseguito prima che venga chiamata un'azione del controller. Si potrebbe desiderare di provare a racchiudere la logica del controllore in un blocco catch try utilizzando un criterio e applicando tale criterio come predefinito su tutte le azioni del controller. Non ho provato questo ed è solo un pensiero casuale che mi ha attraversato la mente. Fammi sapere se funziona. Potrei provarlo più tardi –

+0

Non è davvero una risposta * ancora *, ma tieni d'occhio [zone] (http://strongloop.com/strongblog/announcing-zones-for-node-js/) - tra l'altro cose che risolve il problema di gestione degli errori in nodejs. –

risposta

4

Le migliori pratiche utilizzano Domains nel controller. Questo gestirà le eccezioni nel codice asincrono, ed è relativamente semplice.

È possibile utilizzare qualcosa come trycatch per semplificare un po 'le cose, ma le eccezioni basate sul dominio saranno più efficaci. Assicurerà che le eccezioni non blocchino la tua applicazione. È sufficiente creare un nuovo dominio nel controller e eseguire i metodi del controller all'interno di tale dominio.

Poiché Sailsjs è basato su Express, è possibile utilizzare il middleware di connessione e creare facilmente un nuovo dominio dal middleware. C'è qualcosa come express-domain-middleware. Questa potrebbe essere l'opzione più estetica e più conveniente.

Aggiornamento: Come menzione da Benjamin Gruenbaum, Domini sono previsti per diventare obsoleta in v1 di nodo. Forse dovresti leggere attraverso Joyents Error Handling Best Practices. È agnostico al framework che stai utilizzando.

In aggiunta, è comunque possibile utilizzare i domini, mentre non esiste un modo per gestire globalmente gli errori in node.js altrimenti. Una volta deprecato, puoi sempre rimuovere la tua dipendenza dai domini, in modo relativamente semplice. Detto questo, potrebbe essere meglio non fare affidamento unicamente sui domini.

Strongloop fornisce anche una libreria ispirata ai domini denominati Zone. Anche questa è un'opzione.

+1

I domini saranno probabilmente deprecati nel prossimo futuro. https://github.com/iojs/io.js/issues/66 –

+0

Definisci "prossimo futuro", v0.11 non ha nemmeno una data di rilascio impostata, e v0.12 non sarà visto per almeno un altro anno, e questo è ottimista. AFAIK v1 non è nemmeno in fase di sviluppo, è solo un _thought_ finora. Si è persino detto che i domini saranno probabilmente spostati in un pacchetto (fuori dal nucleo) per mantenere la compatibilità all'indietro. Se si utilizza il middleware come suggerito, sarebbe facilmente possibile sostituire la gestione delle eccezioni. – tsturzl

+0

Nel prossimo futuro è ~ un mese. Il nodo è stato recentemente biforcato in io.js e la maggior parte dei contributori principali è stata migrata (a causa del ciclo di rilascio). Ho detto deprecato non rimosso. –

0

Non ho provato questo, ma credo che si dovrebbe essere in grado di impostare un gestore di eccezioni catch-all in bootstrap.js utilizzando process.on('uncaughtexception').

Personalmente, utilizzo le promesse tramite la libreria bluebird e inserisco un'istruzione catch che trasmette tutti gli errori a una funzione di gestione degli errori globale.

+0

Non sto effettuando downvoting, ma questa è una pratica molto negativa in quanto l'applicazione sta emettendo un'eccezione non gestita da qualche parte. Questa è una gestione lenta degli errori, e ogni volta che questo viene suggerito a chiunque, devi accompagnarlo con il fatto che il processo dovrebbe essere fermato e riavviato e dovresti ** non ** tentare di continuare quello che stavi facendo (caricamento, scrittura di un file , comunicazione db, ecc.). È necessario interrompere tutto e riavviare il processo del nodo. –

+0

Presumo che tu ti stia riferendo alla soluzione di non-promessa, che dovrei davvero avere preceduto con un "Ehi, puoi farlo, ma non farlo". – CaseyWebb

+0

Non proprio, e non volevo scenderti addosso, ma scrivere codice con eccezioni non rilevate è solo una cattiva pratica e catturarlo nella "top" dell'app come questo è solo pigro. La maggior parte dei server non richiede il riavvio del processo del server in queste situazioni. Il nodo lo fa. Se rilevi l'eccezione e non riavvii il processo, il nodo può rimanere bloccato in uno "stato sconosciuto" (è come lo dicono i documenti se ricordo male). –

1

L'OK consente di escludere l'errore dell'istanza del nodo a causa di un errore di programmazione, altrimenti può continuare in uno stato incoerente e in una logica aziendale di blocco. Nell'ambiente di produzione il server può essere riavviato in caso di arresto anomalo, questo ripristinerà il suo stato e lo manterrà disponibile, se l'errore non è frequente. E in tutto questo è molto importante registrare tutto. Questo vale per la maggior parte delle configurazioni dei nodi, incluso SailsJS.

Il seguente approccio può essere preso:

  1. Utilizzare un Logger: Un registratore dedicato dovrebbe essere accessibile ai componenti del server. Dovrebbe essere collegato a un servizio che notifica lo sviluppatore (email?) Di errori molto gravi.
  2. Errori di propagazione per richiesta fino alla fine: inoltrare con attenzione gli errori da qualsiasi passaggio nell'elaborazione della richiesta. In ExperssJs/ConnectJs/setup basati su middleware, è possibile utilizzare next(err) per passare un errore nella catena middleware. Un middleware di cattura errori alla fine della catena otterrà questo errore, lo registrerà dettagliato e invierà uno stato di 500 indietro. È possibile utilizzare Domains o Zones o Promises o async o qualsiasi altra cosa si desideri per elaborare la richiesta e rilevare gli errori.
  3. Arresta su process.on('uncaughtexception'): registra l'errore, esegue la pulizia necessaria e genera di nuovo lo stesso errore nel processo di arresto.
  4. Utente PM2/Forever o Upstart/init.d su linux: Ora quando il processo si arresta a causa dell'eccezione errata, questi strumenti lo riavvieranno e monitoreranno il numero di time server in crash. Se il server si arresta in modo eccessivo, è bene fermarlo e agire immediatamente.
+1

Upstart/init.d sarebbe una grande estensione alla tua quarta raccomandazione. Come per sempre, non è possibile riavviare un'applicazione se il server si riavvia in modo imprevisto. PM2 offre una soluzione a questo problema, tuttavia PM2 richiede che il nodo v0.11 funzioni in modo efficace e possa avere un comportamento imprevisto su v0.10 o inferiore in quanto si basa su moduli core 'experimental'. – tsturzl

+0

@tsturzl Grazie. Aggiornato nella risposta. –