代码之家  ›  专栏  ›  技术社区  ›  GeraltDieSocke

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

  •  0
  • GeraltDieSocke  · 技术社区  · 6 年前

    问题 :

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

    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 在我的方法中,引用这个用户,当我在模型(文档)中登录它时,它上面有所有必需的字段(用户名、电子邮件和密码)。 我也尝试过 Joi.validate(this.toObject(), schema) 但这不会改变任何东西。

    有人能告诉我发生了什么事,为什么不起作用吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   GeraltDieSocke    6 年前

    有人好奇是什么问题吗? 我不知怎么搞砸了joi的整个语法(复制了我在stack lol上找到的一些旧代码)。

    我是这样修好的:

    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 });
    };