2010-05-23 13 views
11

Estoy intentando escribir un servidor de socket TCP simple que difunde información a todos los clientes conectados. Entonces, cuando un usuario se conecta, se agregan a la lista de clientes, y cuando la transmisión emite el evento de cierre, se eliminan de la lista de clientes.Errores no detectables en node.js

Esto funciona bien, excepto que a veces estoy enviando un mensaje justo cuando un usuario se desconecta.

He intentado envolver stream.write() en un bloque try/catch, pero no tuve suerte. Parece que el error es imposible de atrapar.

Respuesta

18

La solución es agregar un oyente para el evento 'error' de la transmisión. Esto puede parecer contraintuitivo al principio, pero la justificación para ello es sólida.

stream.write() envía datos de forma asincrónica. En el momento en que ese nodo se ha dado cuenta de que escribir en el socket ha provocado un error, su código se ha movido, más allá de la llamada a stream.write, por lo que no hay forma de que genere el error allí.

En cambio, lo que hace el nodo en esta situación es emitir un evento de "error" de la transmisión y EventEmitter se codifica de modo que si no hay oyentes para un evento de "error", el error se genera como una excepción de nivel superior, y el proceso termina.

+0

¡Excelente respuesta! Mi pregunta adicional aquí: ¿qué se supone que debe hacer el controlador de errores (oyente): simplemente registra el error o también llama a la próxima devolución de llamada? –

14

Peter está del todo bien,

y también hay otra manera, también se puede hacer una captura de todo gestor de errores con

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

esto va a coger todo lo que se lanza ...

generalmente es mejor hacerlo así, si es posible; sin embargo, si está escribiendo, por ejemplo, un marco de prueba, puede ser una buena idea usar process.on('uncaughtException',...

aquí es una esencia que cubre (creo) todas las diferentes tiendas de comida de errores de manipulación en nodejs http://gist.github.com/636290

1

tuve el mismo problema con el ejemplo del servidor de tiempo de here Mis clientes son asesinados y el servidor de tiempo, entonces intenta escribir en el zócalo cerrado.

Establecer un controlador de errores no funciona, ya que el evento de error solo se dispara en la recepción. El servidor de tiempo no recibe, (vea la documentación del evento de flujo).

Mi solución es establecer un controlador en el evento de cierre de flujo.

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