为什么我的模型上的猫鼬验证方法不能与Joi一起使用?

时间:2019-01-22 21:15:06

标签: node.js mongoose 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)的方法,但是没有任何改变。

有人可以向我解释发生了什么,为什么不起作用?

1 个答案:

答案 0 :(得分:0)

对于任何人好奇的问题是什么? 我以某种方式搞砸了joi的整个语法(复制了我在Stack大声笑中找到的一些旧代码)。

我这样修复:

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