Foxx 非常灵活,它“只是”在 ArangoDB 的 JavaScript 环境中运行。此环境与 Node(以及因此 NPM 上的某些模块)不完全兼容,尤其是在涉及异步代码或文件系统和网络 I/O 时。
具体来说,该fs
模块不同于 Node 的内置fs
模块。
幸运的是remove
和mkdirp
模块提供的两个功能已经内置在 ArangoDB 的fs
模块中:
fs.makeDirectoryRecursive
相当于mkdirp
fs.removeDirectoryRecursive
相当于remove
可以从 ArangoDB 内部生成外部进程,但相关功能是内部 API 的一部分,不打算在 Foxx 服务中使用(除其他限制外,目前无法获取输出,只有退出状态)。
根据您想要实现的目标以及您的性能要求,将 I/O 繁重的代码分离到外部 Node 微服务中可能确实是一个更好的主意。Foxx 最适合作为底层数据库的应用程序逻辑包装器,所有 Foxx 代码有效地与其他 ArangoDB JavaScript 代码一起运行,因此长时间运行的请求会影响 ArangoDB 处理需要触及 JavaScript 层的其他请求的能力。
在您的特定情况下(您提到与 SCM 软件交互),我建议创建一个小型独立节点服务来处理与 SCM 相关的逻辑,并在必要时与两者进行通信(甚至直接在两个服务之间)。虽然这意味着最初会增加一些开销,但它也将比在 ArangoDB 中将 CPU 周期花费在非数据库相关任务上更具可扩展性。