我认为,node.error并不会在所有情况下都阻止流量。我的目的是捕获错误,保存有效载荷并停止流。

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

观察

功能节点-既没有捕获到错误,也没有停止流。

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

Postgres节点-没有捕获到错误,但是流停止了。

实验

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

功能节点

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

我将JSON节点连接到MQTT Input节点,以将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);
      };


问题

如何确定引发node.error()的任何节点一定会被Catch节点捕获?或者,在这种情况下,“捕获”节点将不会捕获node.error()吗?

评论

在Postgres节点上,我提交了PR,以引发Catch节点可以捕获的错误。

#1 楼

来自文档:

如果错误是该节点的用户可能想自行处理的错误,则应使用原始消息(如果这是一个Input节点,则为空消息)调用该函数。 )作为第二个参数:
node.error(“发生错误”,味精);
这将触发同一选项卡上存在的所有Catch节点。一个参数的对象不会触发Catch节点。

评论


而且,无论是否使用一个或两个参数调用node.error,流程都将停止?

– cogitoergosum
18年7月4日在10:48

同样,这将取决于节点,尽管它应该停止流-但没有什么会阻止节点实现在node.error之后调用node.send并发送消息。

–名词
18年7月5日在10:58