为什么Mongoose预挂钩不能使用fat-arrow函数语法

时间:2018-03-26 06:36:32

标签: node.js mongoose

我正在尝试使用一个简单的预挂钩Mongoose来删除这样的文档的任何引用:

PostSchema.pre("remove", async () => {
  await Comment.remove({ _postId: this._id }).exec();
  await User.update({ $pull: { _posts: this._id } }).exec();
});

上面的胖箭头语法似乎不起作用 - 虽然删除了Post文档,但Comment和User模型不会相应更新。相反,我必须使用旧语法(根据mongoose文档)来使钩子正常工作,如下所示:

PostSchema.pre("remove", async function() {
  await Comment.remove({ _postId: this._id }).exec();
  await User.update({ $pull: { _posts: this._id } }).exec();
});

我觉得这很奇怪,除非我当然做错了。这是预期的行为吗?

1 个答案:

答案 0 :(得分:4)

因为this指向全局范围,而不是箭头函数中的函数范围。在这种情况下,请使用function(){}代替

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

编辑:类似的问题:https://stackoverflow.com/a/49441708/7526159