因此,我正在尝试为我的所有更新前挂钩创建帮助函数:
const preUpdateHelper = function(updateQuery, updateMethod) {
const update = updateQuery.getUpdate();
if (update && update.$set && update.$set.emailAddress) {
const emailAddress = update.$set.emailAddress;
updateMethod({}, {$set: {emailAddress: emailAddress.trim()}});
}
updateMethod({},{ $set: { updatedAt: new Date() } });
}
UserSchema.pre('findOneAndUpdate', function() {
const updateMethod = this.findOneAndUpdate;
var x = function() {
console.log('hi');
};
console.log(x)
x();
console.log(updateMethod);
updateMethod({},{$set: {updatedAt: new Date()}});
console.log('after update method ')
preUpdateHelper(this, this.findOneAndUpdate);
});
日志打印:
[Function: x]
hi
[Function]
因此,after update method
未打印。我收到错误消息:Cannot set property 'op' of undefined
。
我无法弄清楚为什么在将其分配给变量后不能调用此方法。任何帮助将不胜感激!
答案 0 :(得分:0)
最可能是this
上下文。
const updateMethod = this.findOneAndUpdate;
//...
updateMethod(args);
与
不同this.findOneAndUpdate(args);
尝试绑定方法:
const updateMethod = this.findOneAndUpdate.bind(this);
这是展示这些事物有何不同的最小示例:
const foo = {
myName: "foo",
introduceYourself: function() {
console.log("Hello, my name is " + this.myName);
}
}
foo.introduceYourself(); // logs what everyone expects
const introduceYourself = foo.introduceYourself;
introduceYourself(); // logs undefined
const introduceFoo = introduceYourself.bind(foo);
introduceFoo(); // logs foo again
introduceYourself
在OOP中并不完全称为方法。它与foo
并没有真正的联系。仅通过将其作为对象属性foo.introduceYourself
(或等效项:foo['introduceYourself']
)进行调用,您才能将foo
作为其this
上下文进行传递。 Otherwise,
引入您自己的信息不正确。
将this
上下文传递给函数的其他方法是bind
(如下所示),call
和apply
。
进一步阅读-凯尔·辛普森(Kyle Simpson)的“您不知道JS:this和Object Prototypes”。