2010-05-23 17 views
11

Quindi sto cercando di scrivere un semplice server socket TCP che trasmetta informazioni a tutti i client connessi. Quindi, quando un utente si connette, viene aggiunto all'elenco dei client e quando lo stream emette l'evento close viene rimosso dall'elenco dei client.Errori non intercambiabili in node.js

Questo funziona bene, tranne che a volte sto inviando un messaggio proprio come un utente si disconnette.

Ho provato a inserire stream.write() in un blocco try/catch, ma senza fortuna. Sembra che l'errore sia inafferrabile.

risposta

18

La soluzione è aggiungere un listener per l'evento "errore" del flusso. All'inizio questo potrebbe sembrare contro-intuitivo, ma la giustificazione per questo è sana.

stream.write() invia dati in modo asincrono. Nel momento in cui il nodo si è reso conto che la scrittura sul socket ha generato un errore in cui è stato spostato il codice, oltre la chiamata a stream.write, quindi non c'è modo di segnalare l'errore.

Invece, quale nodo in questa situazione emette un evento di 'errore' dal flusso e EventEmitter è codificato in modo tale che se non ci sono ascoltatori per un evento 'errore', l'errore viene generato come un'eccezione di livello superiore, e il processo finisce.

+0

Ottima risposta! La mia domanda addizionale qui: quale gestore di errori (listener) di solito si suppone di fare: basta registrare l'errore o anche chiamare 'next' callback? –

14

Peter è giusto,

e v'è anche un altro modo, si può anche fare una cattura tutti gestore degli errori con

process.on('uncaughtException',function(error){ 
// process error 
}) 

questo prenderà tutto ciò che viene gettato ...

di solito è meglio fare questo modo di Peter, se possibile, tuttavia se si scrive, per esempio, un framework di test, può essere una buona idea usare process.on('uncaughtException',...

ecco un succo che copre (credo) tutti i vari omaggi di gestione degli errori in nodejs http://gist.github.com/636290

1

Ho avuto lo stesso problema con l'esempio time server da here I miei clienti vengono uccisi e il time server tenta poi di scrivere su una presa chiusa.

L'impostazione di un gestore errori non funziona poiché l'evento di errore si attiva solo alla ricezione. Il server orario non riceve, (consultare la documentazione dell'evento stream).

La mia soluzione è impostare un gestore sull'evento di chiusura del flusso.

stream.on('close', function() { 
    subscribers.remove(stream); 
    stream.end(); 
    console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n"); 
}); 
Problemi correlati