我遇到了一段包含查询findOne然后是exec()函数的Mongoose代码.
我以前从未在Javascript中看过那种方法?它究竟做了什么?
我想在自动保存特定模型后始终填充子文档。我真正想要的是以下内容:
MyModel.post('save', function(doc, next) {
doc.populate('path').then(next);
});
Run Code Online (Sandbox Code Playgroud)
但是,上述方法不起作用,因为
post中间件不直接接收流控制,例如没有next或done回调传递给它。post钩子是为这些方法注册传统事件侦听器的一种方式。
当然,有“异步 Post Hooks”,但它们仍然不接收控制流,因此无法保证在我需要时会填充子文档。
为什么不直接使用嵌入式文档?对于这种情况,子文档与父文档相同(例如,我使用的是 Composite 模式之类的东西),这会导致我不确定如何解决(或者我是否可以解决)的循环依赖. 对于其他情况,我可能希望能够在不通过父文档的情况下访问子文档。
我考虑的另一种方法是:
const nativeSave = /* ? */;
MyModel.methods.save = function save() {
return nativeSave.call(this).then(function(savedDoc) {
return savedDoc.populate('path');
});
};
Run Code Online (Sandbox Code Playgroud)
然而,这有两个问题。首先,这似乎是一个迂回的解决方案。如果有一种更原生的方法不违背猫鼬的实现,我会更喜欢那个。其次,我不知道我会设置什么nativeSave(如 所示/* ? */)。
那么,对于获得这种行为有哪些建议呢?如果我的第二个解决方案对当前版本的猫鼬来说是最好的,我应该设置nativeSave什么?我已经考虑过嵌入文档,所以除非您提供有关解决循环依赖的建议,否则请不要建议使用它们。即便如此,我还是想要针对我提到的其他用例的解决方案。
正如我在评论中所解释的,这与按照其他帖子的要求保存后手动填充子文档不同。我希望这会自动发生以避免泄露我的实现细节(例如使用 ObjectIds 而不是真实文档)。