【问题标题】:Node-Red: How to stop nodes processing too quickly?Node-Red:如何停止节点处理过快?
【发布时间】:2021-11-26 08:25:29
【问题描述】:

我目前正在 MS Excel 中创建仪表板,使用 Node-RED 从源系统获取数据。为了不必一直导入所有收集的数据,我创建了一个流程,使用“node-red-contrib-fs-ops 1.6.0”检查文件(特别是“ImportSuccess.csv”)是否存在,特别是 fs-ops-access。

如果不是,则消息将进入一个 Join-Node 并附加到一个数组中。

如果是,那么 ImportSuccess.csv 应该被删除,触发它的消息将获得“msg.complete”属性,并将被传递到前面提到的 Join-Node 并触发它将整个数组发送到 csv -file,覆盖其先前的内容。然后,在 Excel 中,我从该 csv 文件中获取数据并创建一个新的“ImportSuccess.csv”以与 Node-RED 通信,表明我的工具已准备好接收新一批数据。

出现以下问题:由于检查存在和删除文件是两个不同的步骤,第二条消息可以成功通过存在检查,这导致存储 csv 文件的双重覆盖,从而导致数据丢失。

有没有办法防止这种情况发生?

流程图:

据我了解,在下一条消息通过“文件访问”节点之前,我需要“强制”上层分支完全完成。

【问题讨论】:

  • 在删除之前检查文件属性以查看它是否已更新
  • 您能详细说明一下吗?我对 Node-RED 还很陌生。循环的工作方式如下:Excel 创建 ImportSuccess.csv -> Node-RED 找到它,将其删除并将收集的消息发布到临时 csv 文件中,覆盖以前的内容 -> excel 导入新内容并创建新的 ImportSuccess.csv。检查文件属性如何有助于防止两条消息由于异步流而通过上层分支?

标签: node-red


【解决方案1】:

通过编写我自己的函数节点找到解决方案 - ty 用于签入

编辑:如何使用函数节点解决问题

  1. 使用 fs 编辑 Settings.js:functionGlobalContext 下的 require("fs")

  2. 如下编写函数节点:

var fs = global.get("fs");
var path = "Your Path";

if fs.existsSync(path){
    >Add attribute "complete" to msg for the Join Node to detect and trigger sending
    msg.complete = Boolean(1);
   
   >Delete File
   fs.unlinkSync(path);
}

return msg;

【讨论】:

  • 如果您找到解决方案,请在此处发布有相同问题的人的答案
  • 完成 - 如果有语法错误,请随时纠正,必须从内存中写入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2021-11-11
相关资源
最近更新 更多