假设我有一个猫鼬模型m.
这个模型是使用Schema创建的,它添加了一个记录事物的方法:
s.methods.log = function(s) {
this.theLogger(s);
}
theLogger必须随时都可以提供,所以我在postinit hook处提供了theLogger.
这有效:
const x = await m.findOne({_id: ...});
x.log("something");
这里的问题是这不起作用:
const x = new m();
x.log("something"); // <--- theLogger is not defined.
有没有办法挂钩使用new运算符创建x的时刻?
解决方法:
我仍然不知道这些钩子是否存在,所以我最终通过使用函数扩展模型来解决这个问题:
return ((parent) => {
function HookedModel(a, b) {
// Pre new hooks here <-----
this.constructor = parent;
parent.call(this, a, b);
// Post new hooks here <-----
}
// Copy all static functions:
for (const k in parent) {
if (parent.hasOwnProperty(k)) {
HookedModel[k] = parent[k];
}
}
HookedModel.__proto__ = parent.__proto__;
HookedModel.prototype = Object.create(parent.prototype);
HookedModel.prototype.constructor = HookedModel;
return HookedModel;
})(model);