调用在更新前挂钩中分配给变量的方法

时间:2019-05-24 06:45:35

标签: javascript node.js

因此,我正在尝试为我的所有更新前挂钩创建帮助函数:

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

我无法弄清楚为什么在将其分配给变量后不能调用此方法。任何帮助将不胜感激!

1 个答案:

答案 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(如下所示),callapply

进一步阅读-凯尔·辛普森(Kyle Simpson)的“您不知道JS:this和Object Prototypes”。