为什么我的模型上的猫鼬验证方法不适用于 Joi?

Why isn't my mongoose validation method on the model not working with Joi?

问题:

我设置了基本的身份验证流程。 我的用户模型上有这个自定义方法:

userSchema.methods.joiValidate = function() {
  console.log(typeof this.username);
  const Joi = require("joi");
  const schema = {
    username: Joi.types.String.min(6)
      .max(24)
      .required(),
    email: Joi.types.String.email().required(),
    password: Joi.types.String.min(8)
      .max(30)
      .regex(/[a-zA-Z0-9]{3,30}/)
      .required()
  };
  return Joi.validate(this, schema);
};

但它没有按预期工作。

当我创建一个新用户并像这样验证它时:

const invalidUser = new User({
      username: "bob",
      email: "test@gmail.com",
      password: "test123"
    });
invalidUser.joiValidate();

我收到此错误消息:TypeError: Cannot read property 'String' of undefined

不知道为什么? this 在我的方法中指的是这个用户,当我在模型(文档)本身中 console.log 时,它上面有所有必填字段(用户名、电子邮件和密码)。 我也尝试 Joi.validate(this.toObject(), schema) 方法,但这并没有改变任何东西。

任何人都可以向我解释发生了什么以及为什么它不起作用吗?

任何想知道问题出在哪里的人 - 我不知何故弄乱了 joi 的整个语法(复制了一些我在 Whosebug 上找到的旧代码,哈哈)。

我是这样修复的:

    userSchema.methods.joiValidate = function() {
    
      // pull out just the properties that has to be checked (generated fields from mongoose we ignore)
      const { username, email, password } = this;
      const user = { username, email, password };
      const Joi = require("joi");
      const schema = Joi.object().keys({
        username: Joi.string()
          .min(6)
          .max(24)
          .required(),
        email: Joi.string()
          .email()
          .required(),
        password: Joi.string()
          .min(8)
          .max(30)
          .regex(/[a-zA-Z0-9]{3,30}/)
          .required(),
        _id: Joi.string()
      });
    
      return Joi.validate(user, schema, { abortEarly: false });
    };