Archivo de la etiqueta: Manejor Errores Node-RED

Manejo de errores en Node-RED

Node-RED proporciona los nodos Catch y Status como formas de generar flujos que pueden responder a errores. Como no existe una asociación visual directa entre un nodo Catch y los nodos a los que apunta, debe considerar cómo colocarlos para mantener los flujos legibles.

Colocarlos cerca de las partes del flujo a las que corresponden puede ayudar, pero debe tener cuidado de no sobrecargar los flujos.

Otro enfoque es agrupar todos los flujos de manejo de errores debajo del flujo principal, haciendo que la ruta “buena” sea claramente distinta de las rutas de error.

Dar a sus nodos Catch un nombre claro también es muy importante para ayudar a identificar fácilmente los escenarios que deben manejar. Cualquiera que sea el enfoque que elija, intente ser coherente en los diferentes flujos.

Manejar errores con Node-RED: https://nodered.org/docs/user-guide/handling-errors

Manejo de errores:

Si bien es fácil crear flujos que hacen lo correcto cuando todo funciona, también es importante pensar en lo que podría salir mal.

Por ejemplo, si el flujo interactúa con una base de datos externa o API, ¿qué sucede si deja de responder a las solicitudes? ¿O qué pasa si los nodos MQTT pierden su conexión con un corredor?

El manejo de errores en cualquier aplicación es esencial para garantizar que este tipo de eventos se manejen correctamente. Lo que signifique manejar el error dependerá de los requisitos de la aplicación. Es posible que desee probar una acción que falló o activar una alerta por separado, o tal vez el error sea un evento completamente esperado que es solo otra parte de la lógica de la aplicación.

Node-RED proporciona dos formas para que un nodo informe un error. Puede simplemente escribir un mensaje en el registro o puede notificar al tiempo de ejecución del error y hacer que se active un flujo.

El nodo de catch, es similar a la instrucción “try/except” en python, es decir, sirve para el manejo de excepciones.

Si el error solo se escribe en el registro, verá el mensaje en la barra lateral de depuración y la salida del registro, pero no podrá crear un flujo para manejarlo.

Si notifica al tiempo de ejecución correctamente, entonces es un error detectable que puede usarse para desencadenar un flujo de manejo de errores.

Hay un tercer tipo de error que puede hacer que el tiempo de ejecución de Node-RED se apague. Estos errores uncaughtException no se pueden manejar en el flujo y son causados por errores en los nodos.

Más información: https://techexplorations.com/guides/esp32/nore-red-esp32-project/node-red-catch/ 

Logging Errors

Cuando se produzca un error, este aparecerá en la barra de debug.

Esto muestra el mensaje de error, la fecha/hora del error y el nodo que registró el error. Al igual que con otros mensajes de depuración, al colocar el cursor sobre él, se resaltará el nodo en el espacio de trabajo. Si no está en la vista actual, al hacer clic en el nombre del nodo en la esquina superior se mostrará en el espacio de trabajo.

Nodo Catch

Si un nodo notifica al tiempo de ejecución de un error, entonces el nodo Catch puede usarse para crear un flujo para manejarlo. Si un nodo Catch detecta un error, no se registrará en la barra lateral Debug.

El mensaje enviado por Catch será el mensaje proporcionado por el nodo que informa del error. Este mensaje tendrá un conjunto de propiedades de error que proporciona información sobre el error:

 {
     "topic": ...,
     "payload": ...,
     "error": {
         "message": "An error",
         "source": {
             "id": "2e25823d.fa3f7e",
             "type": "function",
             "name": "My Function",
             "count": 1
         }
     }
 } 

Count indica cuántas veces un nodo ha lanzado este mensaje. Esta propiedad es utilizada por el tiempo de ejecución para detectar mensajes atascados en un bucle, donde se devuelven al nodo de origen, que luego registra el error nuevamente, y así sucesivamente. El tiempo de ejecución permitirá que un mensaje se repita 9 veces antes de registrar otro error, que no se puede detectar que rompa el bucle. Eliminar esta propiedad deshabilitará la verificación.

Si el mensaje ya tenía una propiedad msg.error cuando el nodo informó el error, esa propiedad se moverá a msg._error.

De forma predeterminada, el nodo Catch está configurado para ser activado por todos los nodos en la misma pestaña en el editor, pero también se puede configurar para apuntar a nodos específicos en la pestaña.

Si un nodo Catch está configurado para que lo activen todos los nodos, también se puede configurar para que solo se active en errores que aún no hayan sido detectados por otro nodo Catch. Esto le permite crear flujos de manejo de errores que se dirigen a nodos específicos y también tener un controlador de errores que capturará “todo lo demás”.

Si se registra un error desde el interior de un subflow, el tiempo de ejecución primero comprobará si hay nodos Catch dentro del subflujo. Si no hay ninguno allí, el error se propagará hasta el flujo que contiene la instancia del subflujo.

Más información: https://nodered.org/docs/user-guide/handling-errors#catchable-errors 

Errores no Registrados

Estos son los errores que un nodo escribe en el registro sin notificar al tiempo de ejecución correctamente. No se pueden manejar mediante el nodo Catch.

El nodo puede proporcionar formas alternativas de manejar el error. Por ejemplo, actualizando su propiedad de estado (que se puede monitorear con el nodo Status). Puede enviar un mensaje normalmente, pero con alguna propiedad adicional establecida para indicar el error.

Errores “uncaughtException”

Estos son un tipo particular de error de node.js que puede ocurrir cuando un nodo no puede manejar correctamente un error interno. Hacen que todo el tiempo de ejecución de Node-RED se apague, ya que eso es lo único seguro que se puede hacer.

Más información: https://nodejs.org/api/process.html#process_warning_using_uncaughtexception_correctly 

La causa típica será que un nodo haya iniciado una tarea asincrónica y esa tarea haya producido un error. Un nodo bien escrito habrá registrado un controlador de errores para esa tarea, pero si no hay uno, el error no se detectará.

Si encuentra este tipo de error, debe intentar identificar qué nodo causó el error y elevar un caso contra el autor del nodo. Esto no siempre es fácil debido a la naturaleza asincrónica del error.

Nodo Status

No todas las condiciones de error aparecerán como eventos de error que pueden detectarse en un nodo Catch. Por ejemplo, los nodos MQTT que pierden su conexión no generarán un error, pero sí un cambio de estado.

Así como el nodo Catch se puede usar para manejar eventos de error, el nodo Status se puede usar para manejar cambios en el estado de un nodo.

El mensaje enviado por el nodo Estado incluye la propiedad de estado que proporciona información sobre el estado y el nodo que desencadenó el evento.

 {
     "status": {
         "fill": "red",
         "shape": "ring",
         "text": "node-red:common.status.disconnected",
         "source": {
             "id": "27bbb5b1.d3eb3a",
             "type": "mqtt out"
         }
     }
 } 

El la visualización del estado de los nodos está habilitado de forma predeterminada, pero se puede deshabilitar en el menú > configuración

Aunque es útil como indicador visual, es aún más útil tener esta información de estado disponible en el flujo y poder tomar medidas en función del estado del nodo. Para ello disponemos del nodo “Status”.

Al añadir este nodo debe indicarse que nodos vamos a monitorizar su estado. El nodo de estado envía un mensaje cada vez que cambia el estado de los nodos supervisados. Este mensaje consta de dos objetos.

  • objeto de estado: se utiliza para obtener información de estado
  • objeto de origen: identifica el origen del mensaje mediante el ID de nodo. Cada nodo tiene una identificación de nodo única.

Debido a que la información de estado solo se envía cuando el estado cambia, generalmente es necesario colocar la información en una variable global o de flujo. Para hacer esto, pase el mensaje de estado a un nodo de función que tenga el siguiente código.

 var mqtt_status=msg.status;
 global.set('mqtt_status',mqtt_status);
 return;

Al crear funciones puedo poner un estado que sea leible desde el nod status: https://nodered.org/docs/creating-nodes/status 

Más información: http://www.steves-internet-guide.com/using-the-node-red-status-node/ 

Nodo Complete

Activa un flujo cuando otro nodo completa el tratamiento de un mensaje. Si un nodo le dice al runtime cuando ha terminado de manejar un mensaje, este nodo puede usarse para desencadenar un segundo flujo.

Por ejemplo, esto se puede utilizar junto con un nodo sin puerto de salida, como el nodo de envío de correo electrónico, para continuar el flujo.

Este nodo debe estar configurado para manejar el evento para los nodos seleccionados en el flujo. A diferencia del nodo Catch, no proporciona un modo ‘manejar todo’ que se aplica automáticamente a todos los nodos del flujo.

No todos los nodos activarán este evento; dependerá de si se han implementado para admitir esta función como se introdujo en Node-RED 1.0.

Más información: https://nodered.org/blog/2019/09/20/node-done