【问题标题】:Why do Mongoose pre-hooks not work with fat-arrow function syntax为什么 Mongoose 预钩子不适用于胖箭头函数语法
【发布时间】:2018-03-26 14:55:27
【问题描述】:

我正在尝试使用简单的 pre-hook 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();
});

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

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么我将如何使用带有粗箭头功能的 pre-hook?
    • 只是不要 :) “旧”函数和箭头函数的区别之一是函数范围和 this 关键字引用。您的底部示例是完全正确的。这是使用 es6/7 和 mongoose 时已知的异常之一
    • 我已经回答了类似的问题,请看:stackoverflow.com/a/49441708/7526159
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多