Node-RED:Рецепты/Как автоматически повторить действие после получения ошибки

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Как автоматически повторить действие после получении ошибки[1]

Проблема

Вам нужно повторить какое-то действие после получения сообщения об ошибке.

Решение

Воспользуйтесь нодой «Catch», т.к. она умеет ловить ошибки и повторно отправлять сообщение ноде, которой нужно повторить какое-либо действие.

Пример

[{"id":"27e61f12.c1a15","type":"inject","z":"fc046f99.4be08","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":320,"wires":[["d7d08440.31b678"]]},{"id":"d7d08440.31b678","type":"function","z":"fc046f99.4be08","name":"Random error","func":"// Randomly throw an error rather than\n// pass on message.\nif (Math.random() < 0.5) {\n   node.error(\"a random error\", msg);\n} else {\n    return msg;\n}","outputs":1,"noerr":0,"x":320,"y":320,"wires":[["f22b1e9a.5d89b"]]},{"id":"f22b1e9a.5d89b","type":"debug","z":"fc046f99.4be08","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":510,"y":320,"wires":[]},{"id":"2166290d.98d736","type":"delay","z":"fc046f99.4be08","name":"","pauseType":"delay","timeout":"2","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":240,"y":380,"wires":[["d7d08440.31b678"]]},{"id":"139b836e.7950ed","type":"catch","z":"fc046f99.4be08","name":"","scope":["d7d08440.31b678"],"uncaught":false,"x":90,"y":380,"wires":[["2166290d.98d736","9c8ab214.0ecaa"]]},{"id":"9c8ab214.0ecaa","type":"debug","z":"fc046f99.4be08","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"error","targetType":"msg","x":240,"y":440,"wires":[]}]

Разбор

Некоторые ошибки временны, и в этих случаях действие нужно просто повторить, чтобы продолжить дальше. Впрочем, бывают случаи, когда перед повторной попыткой нужно выполнить какое-то корректирующее действие. В примере выше нода «Function» имитирует случайную ошибку – в ней задан 50% шанс того, что она либо пропустит сообщение, либо выдаст ошибку.

Нода «Catch» будет ловить эту ошибку, а затем снова отправлять сообщение ноде «Function», чтобы та попробовала снова. В потоке также есть нода «Delay», т.к. в некоторых ситуациях требуется немного подождать перед тем, как попробовать снова.

См.также

Внешние ссылки