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», т.к. в некоторых ситуациях требуется немного подождать перед тем, как попробовать снова.
См.также
Внешние ссылки