ArangoDB FOXX 节点扩展

ArangoDB FOXX node extensions

我正在尝试将应用程序从 sails 转移到 FOXX。我原以为我可以在 FOXX 中使用 node.js 模块,但我 运行 遇到了问题。我需要在服务器上创建一个 "working" 目录来对 SCM 存储库执行操作。我安装了 "remove" 和 "mkdirp" 模块。 mkdirp 模块调用 fs.lstatSync,在 FOXX 下报告丢失。安装 fs 的本地节点副本无法解决问题。

如果这是一个问题,那么我的一些其他任务,例如生成外部命令行程序可能无法完成。在这种情况下,我可能需要重新考虑将所有任务移至 FOXX,但这意味着要在 sails 和 FOXX 中复制大量功能,这可能是一场部署噩梦。

虽然 Foxx 非常灵活,但它在 ArangoDB 的 JavaScript 环境中 "just" 运行。此环境与 Node(以及 NPM 上的某些模块)不完全兼容,尤其是在涉及异步代码或文件系统和网络时 I/O.

特别是 fs 模块不同于 Node 的内置 fs 模块。

幸运的是,removemkdirp 模块提供的两个功能已经内置在 ArangoDB 的 fs 模块中:

  • fs.makeDirectoryRecursive 等同于 mkdirp
  • fs.removeDirectoryRecursive 等同于 remove

可以从 ArangoDB 内部生成外部进程,但相关功能是内部 API 的一部分,并不打算用于 Foxx 服务(除其他限制外,目前无法获得输出,只是退出状态)。

根据您想要实现的目标和您的性能要求,将 I/O 繁重的代码分离到外部节点微服务中可能确实是一个更好的主意。 Foxx 最适合作为底层数据库的应用程序逻辑包装器,所有 Foxx 代码都有效地与其他 ArangoDB JavaScript 代码一起运行,因此长 运行 请求会影响 ArangoDB 处理其他需要的请求的能力触摸 JavaScript 层。

在您的特定情况下(您提到与 SCM 软件交互)我建议创建一个小型独立节点服务来处理与 SCM 相关的逻辑,并在必要时从 sails 与两者进行通信(甚至直接在两个服务之间) .虽然这意味着最初会增加一些开销,但它也比在 ArangoDB 中花费 CPU 个周期处理非数据库相关任务更具可扩展性。