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()
吗?#1 楼
来自文档:如果错误是该节点的用户可能想自行处理的错误,则应使用原始消息(如果这是一个Input节点,则为空消息)调用该函数。 )作为第二个参数:
node.error(“发生错误”,味精);
这将触发同一选项卡上存在的所有Catch节点。一个参数的对象不会触发Catch节点。
评论
而且,无论是否使用一个或两个参数调用node.error,流程都将停止?
– cogitoergosum
18年7月4日在10:48
同样,这将取决于节点,尽管它应该停止流-但没有什么会阻止节点实现在node.error之后调用node.send并发送消息。
–名词
18年7月5日在10:58
评论
在Postgres节点上,我提交了PR,以引发Catch节点可以捕获的错误。