Node-RED docker 读取目录内容时出现问题
Node-RED docker problem reading directory contents
我在 docker 容器中有一个 Node-RED 应用程序 运行ning,目的是定期读取 .csv 文件不断更新和新 .csv 文件不断更新的目录的内容有时添加。重点是定期读取新条目,解析数据,然后继续发送。
我没有使用众多 'contrib' 节点,因为我启用了 NodeJS 'fs' 模块并使用它。此外,内置 'file' 和 'file in' Node-RED 模块在读取 .csv 文件的内容时很有用,因此这不是问题。
问题来自新的 .csv 文件被添加到所有 .csv 文件所在的目录中。我希望能够读取所有文件名,然后读取所有 .csv 文件。
我已经将.csv 文件目录挂载到docker 容器中,在测试我是否能够读取文件名时,发生了奇怪的事情。即使文件在容器中可见(使用 docker exec -it CONTAINER /bin/bash
查看),一段包含 fs.readdir
的代码也不会列出文件。当我尝试 fs.readdir
也看到安装到容器中的 /data
目录的内容时,它列出了大约 10% 的时间的内容(将时间戳注入节点 运行它)
从图中可以看出,有问题的目录的内容并没有在节点的每次执行中列出。包含 .csv 文件的已安装目录的内容永远不会在 运行 使用正确的路径作为参数连接此节点时列出。
操作系统是CentOS 7,我不是sudoer。我设法做到了 none 已安装的文件或目录归 root 所有,因此它们归容器内的用户 node-red 所有。我设法将此目录文件列表拉到我的 ubuntu 上,我是 sudoer,但由于 none 的东西在那里也是 root 拥有的,我不确定这是否是问题所在。我感觉这可能与操作系统有关。
备注:
- 所有相关文件和目录都有权限
rwxr-xr-x
- 我尝试将包含目录的 .csv 文件挂载到
/data
目录下,并将其作为自己的目录直接挂载到根目录下,如 /files
- 我可以使用 Node-RED
file
节点读取文件内容,但不能读取目录。读取静态文件名是不够的,因为目录内容不断变化
- 我已经从安装到容器中的 settings.js 文件中启用了 NodeJS 'fs' 模块
- Node-RED 节点(图中)没有输出任何错误(我通过向图中的函数添加错误 return 来尝试)
- 我已经尝试 运行 Node-RED 容器作为 root 用户并且没有定义用户
- 我正在 运行使用 docker-compose
连接 Node-RED 容器
我希望这不是太多文字或太不清楚,我只是想确保至少我尝试过的大部分内容都写在这里。如果有人对 docker 下 Node-RED 的工作原理和使用 NodeJS fs 模块有一些了解,将不胜感激:)
核心Watch节点应该为您完成所有这些,无需编写功能节点。
如果您想要遍历子目录,请确保在配置中勾选正确的框。
来自监视节点的边栏文档:
The full filename of the file that actually changed is put into
msg.payload and msg.filename, while a stringified version of the watch
list is returned in msg.topic.
msg.file contains just the short filename of the file that changed.
msg.type has the type of thing changed, usually file or directory,
while msg.size holds the file size in bytes.
要回答为什么 Node-RED 大多数时候无法读取目录内容的问题,是因为使用了异步 fs.readdir
模块。当我切换到使用同步版本 fs.readdirSync
时,Node-RED 能够毫无问题地读取目录内容。
我在 docker 容器中有一个 Node-RED 应用程序 运行ning,目的是定期读取 .csv 文件不断更新和新 .csv 文件不断更新的目录的内容有时添加。重点是定期读取新条目,解析数据,然后继续发送。
我没有使用众多 'contrib' 节点,因为我启用了 NodeJS 'fs' 模块并使用它。此外,内置 'file' 和 'file in' Node-RED 模块在读取 .csv 文件的内容时很有用,因此这不是问题。
问题来自新的 .csv 文件被添加到所有 .csv 文件所在的目录中。我希望能够读取所有文件名,然后读取所有 .csv 文件。
我已经将.csv 文件目录挂载到docker 容器中,在测试我是否能够读取文件名时,发生了奇怪的事情。即使文件在容器中可见(使用 docker exec -it CONTAINER /bin/bash
查看),一段包含 fs.readdir
的代码也不会列出文件。当我尝试 fs.readdir
也看到安装到容器中的 /data
目录的内容时,它列出了大约 10% 的时间的内容(将时间戳注入节点 运行它)
从图中可以看出,有问题的目录的内容并没有在节点的每次执行中列出。包含 .csv 文件的已安装目录的内容永远不会在 运行 使用正确的路径作为参数连接此节点时列出。
操作系统是CentOS 7,我不是sudoer。我设法做到了 none 已安装的文件或目录归 root 所有,因此它们归容器内的用户 node-red 所有。我设法将此目录文件列表拉到我的 ubuntu 上,我是 sudoer,但由于 none 的东西在那里也是 root 拥有的,我不确定这是否是问题所在。我感觉这可能与操作系统有关。
备注:
- 所有相关文件和目录都有权限
rwxr-xr-x
- 我尝试将包含目录的 .csv 文件挂载到
/data
目录下,并将其作为自己的目录直接挂载到根目录下,如/files
- 我可以使用 Node-RED
file
节点读取文件内容,但不能读取目录。读取静态文件名是不够的,因为目录内容不断变化 - 我已经从安装到容器中的 settings.js 文件中启用了 NodeJS 'fs' 模块
- Node-RED 节点(图中)没有输出任何错误(我通过向图中的函数添加错误 return 来尝试)
- 我已经尝试 运行 Node-RED 容器作为 root 用户并且没有定义用户
- 我正在 运行使用 docker-compose 连接 Node-RED 容器
我希望这不是太多文字或太不清楚,我只是想确保至少我尝试过的大部分内容都写在这里。如果有人对 docker 下 Node-RED 的工作原理和使用 NodeJS fs 模块有一些了解,将不胜感激:)
核心Watch节点应该为您完成所有这些,无需编写功能节点。
如果您想要遍历子目录,请确保在配置中勾选正确的框。
来自监视节点的边栏文档:
The full filename of the file that actually changed is put into msg.payload and msg.filename, while a stringified version of the watch list is returned in msg.topic.
msg.file contains just the short filename of the file that changed. msg.type has the type of thing changed, usually file or directory, while msg.size holds the file size in bytes.
要回答为什么 Node-RED 大多数时候无法读取目录内容的问题,是因为使用了异步 fs.readdir
模块。当我切换到使用同步版本 fs.readdirSync
时,Node-RED 能够毫无问题地读取目录内容。