数据库替换导致 afterConstruct 问题

Database Substitution Causes afterConstruct Issues

我已经花费了 10 多个小时在可能的 Apsotrophe 数据库增强上,并且被困在一个似乎无关的错误上。我正在尝试使用 NEDB、LokiJS 或 TingoDB 等平面文件数据库切换 MongoDB。它们具有与 MongoDB 相同的可用命令集,有时除了我能够添加的几个小命令外(在下面列出的使用 LokiJS 的情况下,没有 db.collection 方法,所以我写了一个简单的,效果很好)。这样做的最终目标是使托管小型 Apos 项目更容易,因为您无需担心寻找服务来为您托管 MongoDB 实例——它会全部存储在本地文件中(尽管会如果项目太大,速度会非常慢——理论上,LokiJS 应该能够支持最大 1GB 的数据库而不会出现性能问题。

我看到数据正在写入本地数据库文件,所以它似乎在工作。但是,应用程序没有完成启动。没有错误发生,并且应用程序连续运行,但似乎从未达到可访问 URL 的地步。我花了很多时间对此进行调试,当我覆盖 apostrophe-db 中的 connectToMongo 方法时,似乎任何 afterConstruct 方法都停止工作。不知何故,在启动模块时,似乎在异步调用中不会发生撇号启动期间的回调 - 但据我所知,数据库更改不应该影响它。

我有一个显示问题的故障 link。它非常准系统,与默认值相比的唯一变化是覆盖了 connectToMongo 方法。如果您想调试 node.js 端或进行编辑,您可以免费重新混合该项目。如果我能让它正常工作,我计划将它制作成一个 NPM 包,以便其他人也可以使用它 - 虽然在这一点上我很困惑。

https://glitch.com/edit/#!/apos-flat-test

(如果你以前没有使用过Glitch,你可以复制我当前的代码,然后点击左上角的项目名称并点击Remix Project来调试它。你也可以附加到Chrome 的 V8 调试器来调试节点内容 - 您只需单击左上角的“日志”按钮,然后单击底部 window 弹出的调试按钮。

谢谢!

许多 afterConstruct 函数,包括 apostrophe-caches 函数,调用 db.getCollectioncollection.ensureIndex。这是缓存模块中的相关代码:

https://gist.github.com/boutell/c4a1b4abda4a19572428b11d0a8babc8

所以您的实现必须支持这两种情况,有或没有回调。

您的 getCollection 实现看起来应该有效。

然而,LokiJSensureIndex方法与MongoDB中的方法有很大不同。 Mongo数据库预计:

.ensureIndex({ field: 1 }, callback);

虽然 LokiJS 预计:

.ensureIndex(fieldName, force)

这是一种非常不同的方法,具有不同的影响。如果不付出额外的努力,就不能期望它能替代 MongoDB 的实现。

使用对象和回调调用它不会设置预期的索引,更重要的是,永远不会调用回调。这就是它不起作用的原因。如果不调用回调,Apostrophe 将无法继续进行初始化。

所以问题不是 afterConstruct 本身,而是 MongoDB API 的不完整模拟。撇号需要完全实施 API 才能保证成功。使用尝试更高级别兼容性的 "Mongo-alike" 可能会取得更好的成功,尽管 CosmosDB 也没有真正接近(例如,它没有常用的 distinct 便捷方法)。

感谢您试一试并为社区提供更多关于另一个 Mongo 半兼容数据库的数据 - 也许一个最终会足够完整,或者 Apostrophe 社区会为此做出贡献。