虽然在一切正常的情况下很容易创建做对的事情的流程,但考虑可能出错的情况也是很重要的。
例如,如果流程与外部数据库或API交互,当它停止响应请求时会发生什么?或者,当MQTT节点与代理断开连接时会发生什么?
在任何应用程序中进行错误处理都是确保这些事件得到妥善处理的关键。处理错误的方式将取决于应用程序的要求。您可能希望尝试一个失败的操作,或触发一个单独的警报,或者也许该错误是一个完全预期的事件,只是应用程序逻辑的另一部分。
Node-RED提供两种方式让节点报告错误。它可以仅将消息写入日志,也可以通知运行时发生错误并触发一个流程。
如果错误仅写入日志,您将在调试侧边栏和日志输出中看到消息,但您将无法创建一个处理它的流程。这些是无法捕获的错误。
如果它确实正确通知了运行时,那么就是一个可捕获的错误,可以用来触发错误处理流程。
还有第三种错误可以导致Node-RED运行时关闭。这些uncaughtException
错误无法在流程中处理,并且是节点中的bug引起的。
本指南更详细地描述了每种错误类型,并展示了如何处理它们。它还讨论了节点的状态事件如何用于创建处理意外事件的流程。
当节点记录错误时,它将出现在调试侧边栏中。
调试侧边栏中的错误消息
这显示了错误消息、错误的日期/时间以及记录错误的节点。与其他调试消息一样,将鼠标悬停在上面会高亮显示工作区中的节点。如果它不在当前视图中,单击左上角的节点名称将会在工作区中显示它。
如果节点通知运行时发生错误,那么可以使用捕获节点创建一个处理该错误的流程。
捕获节点
如果错误被捕获节点捕获,它将不会被记录到调试侧边栏中。
捕获节点发送的消息将是报告错误的节点提供的消息。该消息将具有设置的error
属性,提供有关错误的信息:
{
"topic": ...,
"payload": ...,
"error": {
"message": "发生错误",
"source": {
"id": "2e25823d.fa3f7e",
"type": "function",
"name": "我的函数",
"count": 1
}
}
}
msg.error
的属性包括:
msg.error
:
message
- 错误消息source
- 有关记录错误的节点的信息:
id
- 源节点IDtype
- 源节点的类型name
- 源节点的名称(如果设置)count
- 此消息已由此节点抛出多少次。
该属性由运行时用于检测循环中的消息 - 消息传回源节点,然后该节点再次记录错误,依此类推。
运行时将在记录另一个不可捕获的错误以打破循环之前允许消息循环9次。删除此属性将禁用检查。如果在节点报告错误时,这个消息已经具有msg.error
属性,则该属性将被移动到msg._error
。
默认情况下,捕获节点配置为由编辑器中同一选项卡的所有节点触发,但也可以配置为仅针对该选项卡上的特定节点。
如果您在同一选项卡上有两个捕获节点,并且它们都目标相同的节点,则它们将都由该节点报告的任何错误触发。
如果捕获节点配置为由所有节点触发,还可以配置为仅在未被另一个捕获节点捕获的错误上触发。这使您能够创建针对特定节点的错误处理流程,并且还具有将捕获“所有其他”错误的错误处理程序。
如果从子流程内部记录错误,运行时将首先检查子流程内部是否有任何捕获节点。如果那里没有,则错误将传播到包含子流程实例的流程。
这些错误是节点将错误写入日志而未妥善通知运行时的错误。它们不能使用捕获节点处理。
节点可能提供替代方式来处理错误。例如,通过更新其状态属性(可以通过状态节点进行监控)。它可能会以正常方式发送消息,但带有一些额外属性来指示错误。
您可能希望联系节点的作者,以查看它是否可以更新以正确记录错误。
uncaughtException
错误这些是特定类型的Node.js错误,当节点未能妥善处理内部错误时可能发生。它们会导致整个Node-RED运行时关闭,因为这是唯一安全的做法。
这听起来可能极端,但这里是node.js文档对此的说明:
尝试在未捕获的异常后正常恢复可能类似于在升级计算机时拔掉电源线。十有八九,什么都不会发生。但第十次,系统会变得损坏。
通常原因将是节点启动了一个异步任务,而该任务遇到了错误。编写良好的节点将为该任务注册一个错误处理程序,但如果没有,错误将会未被捕获。
如果您遇到这种类型的错误,您应该尝试确定哪个节点引起了错误并提出问题。由于错误的异步性质,这并不总是容易。
Node-RED日志中提供的堆栈跟踪将提供有关遇到错误的异步任务的一些线索,这可能有助于您识别出故障节点。
并非所有错误条件都会作为可被捕获的捕获节点的错误事件出现。例如,MQTT节点失去连接不会触发错误,但会触发其状态的变化。
就像捕获节点可以用来处理错误事件一样,状态节点也可以用来处理节点状态的变化。
状态节点发送的消息包括status
属性,该属性提供有关触发事件的状态和节点的信息。
```json { “status”: { “fill”: “red”, “shape”: “ring”, “text”: “node-red:common.status.disconnected”, “source”: { “id”: “27bbb5b1.d3eb3a”, “type”: “mqtt out” } } }
版权所有 OpenJS Foundation 和 Node-RED 贡献者。保留所有权利。OpenJS Foundation 拥有并使用注册商标。有关 OpenJS Foundation 的商标列表,请参阅我们的 商标政策 和 商标列表。未在 OpenJS Foundation 商标列表 中列出的商标和徽标是其各自持有者的商标™或注册商标®。使用它们并不意味着与它们有任何关联或认可。
OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS Foundation 章程 | 商标政策 | 商标列表 | Cookie 政策