Mongoose pre/post midleware无法使用ES6访问[this]实例

Ale*_*aru 13 mongoose node.js

我陷入两难境地,尝试使用pre中间件向mongoose模型添加一些预逻辑,并且不能this像往常一样访问实例.

UserSchema.pre('save', next => {
    console.log(this); // logs out empty object {}

    let hash = crypto.createHash('sha256');
    let password = this.password;

    console.log("Hashing password, " + password);

    hash.update(password);
    this.password = hash.digest('hex');

    next();
  });
Run Code Online (Sandbox Code Playgroud)

问题:*有没有办法访问this实例?

rob*_*lep 30

胖箭头符号(=>)在这种情况下没用.相反,只需使用旧式的匿名函数表示法:

UserSchema.pre('save', function(next) {
  ...
});
Run Code Online (Sandbox Code Playgroud)

原因是胖箭头在词法上将函数绑定到当前范围(更多关于此处,但是TL; DR:胖箭头符号并不意味着是通用的快捷符号,它专门用于创建词法绑定函数),而函数应该在Mongoose提供的范围内调用.

  • 这是正确的,但你可能想要添加对[arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)的引用,可能会引用为什么他们不能在这里使用.;) (2认同)
  • 大家好,我今天学到了一些关于`=>`的新东西 (2认同)