node-red - node.error 有时不会停止流

物联网 节点红色
2021-06-24 05:09:33

我认为,node.error并不是在所有情况下都停止流程。我的目标是捕捉错误,保存有效负载并停止流量。

请参考下面的观察和实验。

观察

功能节点- 既不会捕获错误,也不会停止流程。

JSON 节点- 可以捕获错误并停止流程。

Postgres 节点- 未捕获错误但流停止。

实验

下面的所有实验都有 Catch 节点来处理来自流中所有节点的错误。

功能节点

我添加了一个连接到 Inject 节点的函数节点。该节点的输出是INSERT连接到Postgres 节点的数据库查询在函数节点的顶部,我添加了 this node.error('Test error')虽然可以在控制台中看到错误,但我可以看到插入到数据库中的行。我也无法抓住它。

JSON 节点

我将 JSON 节点连接到 MQTT 输入节点,以将 JSON 字符串有效负载转换为 JSON 对象。这个对象被传递给一个生成INSERT查询语句的函数,并连接到一个 Postgres 节点。为了进行测试,我传递了一个格式错误的 JSON 文档,该文档会导致 JSON 节点出现错误。我可以接住它,流量也停止了。

Postgres 节点

JSON 文档良好node.error(),函数节点没有任何语句,Postgres 节点插入成功。为了测试,我创建了一个格式良好的 JSON 文档,它将引发一条duplicate on insert消息。在这种情况下,我可以在控制台中看到错误消息。但是,我抓不到。

请注意,Postgres 节点确实引发了一个node.error().

查询执行

参考这个

try {
            for (let i=0; i < queries.length; ++i) {
              const { query, params = {}, output = false } = queries[i];
              const result = await client.query(query, params);

              if (output && node.output) {
                outMsg.payload = outMsg.payload.concat(result.rows);
              }
            }

            if (node.output) {
              node.send(outMsg);
            }
          } catch(e) {
            handleError(e, msg);
          } finally {
            client.release();
}

错误处理

参考这个

var handleError = (err, msg) => {
        node.error(err);
        console.log(err);
        console.log(msg.payload);
      };

问题

我如何确定任何引发 a 的节点node.error()肯定会被 Catch 节点捕获?或者,在什么情况下,Catch 节点不会捕获node.error()

1个回答

文档

如果错误是节点的用户可能想要自己处理的错误,则应使用原始消息(如果这是输入节点则为空消息)作为第二个参数调用该函数:

node.error("遇到错误", msg);

这将触发同一选项卡上存在的任何 Catch 节点。

所以node.error()用一个参数调用不会触发 Catch 节点。