在Mongoose中加载后更改模型值

Lan*_*nbo 11 javascript mongoose node.js

在我的猫鼬模型中,我有一些stats依赖于时间.我的想法是在模型加载后立即添加一个中间件来更改这些统计信息.

不幸的是,关于post-Hooks 的文档有点缺乏清晰度.好像我可以使用这样的钩子:

schema.post('init', function(doc) {
    doc.foo = 'bar';
    return doc;
});
Run Code Online (Sandbox Code Playgroud)

他们唯一的例子涉及 - console.log输出.它不以任何方式解释是否doc必须返回或者后挂钩的变化根本不可能(因为它不是异步的,因此对于复杂的想法可能没什么用处).

如果preon 'init'不是在加载时自动更新模型的正确方法,那么它是什么?

hun*_*tis 17

这是我们如何在加载时更新模型,异步工作:

schema.pre('init', function(next, data) {
  data.property = data.property || 'someDefault';
  next();
});
Run Code Online (Sandbox Code Playgroud)

pre-init很特别,其他钩子的签名略有不同,例如pre-save:

schema.pre('save', function(next) {
  this.accessed_ts = Date.now();
  next();
});
Run Code Online (Sandbox Code Playgroud)

  • pre-init是在加载数据之后,但是*之前*文档与该数据(afaik)水合.由于尚未将数据放入文档中,因此存在"此"上下文(它仍然是文档),但它将为空(iirc). (4认同)
  • 所以pre-init实际上是在加载数据之后?文档不在"this"上下文中? (2认同)