Почему мой метод проверки Мангуста на модели не работает с Джои? - PullRequest
0 голосов
/ 23 января 2019

Проблема :

У меня настроен базовый поток аутентификации.У меня есть пользовательский метод на моей модели пользователей:

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 голосов
/ 23 января 2019

Для всех, кому интересно, в чем проблема?Я как-то облажался с полным синтаксисом 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 });
};
...