Как решить эту проблему с неопределенной переменной Node js? - PullRequest
0 голосов
/ 12 декабря 2018

Мы пытаемся преобразовать эти 3 переменные дня рождения, месяца рождения и года рождения в возраст.Мы получаем эти 3 значения из внешнего интерфейса и хотим преобразовать их в age в back-end узла js и сохранить в пользовательской базе данных.Мы используем момент js для преобразования его в возраст.

module.exports = {
  async CreateUser(req, res) {
    const schema = Joi.object().keys({
      username: Joi.string()
        .required(),
      email: Joi.string()
        .email()
        .required(),
      password: Joi.string()
        .required(),
        birthday: Joi.number().integer()
        .required().min(2).max(2),
        birthmonth: Joi.number().integer()
        .required().min(2).max(2),
        birthyear: Joi.number().integer()
        .required(),
        age:age 
    });

    const { error, value } = Joi.validate(req.body, schema);
    if (error && error.details) {
      return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
    }

    const userEmail = await User.findOne({
      email: Helpers.lowerCase(req.body.email)
    });
    if (userEmail) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Email already exist' });
    }

    const userName = await User.findOne({
      username: Helpers.firstUpper(req.body.username)
    });
    if (userName) {
      return res
        .status(HttpStatus.CONFLICT)
        .json({ message: 'Username already exist' });
    }

    return bcrypt.hash(value.password, 10, (err, hash) => {
      if (err) {
        return res
          .status(HttpStatus.BAD_REQUEST)
          .json({ message: 'Error hashing password' });
      }
     const age = moment().diff(moment([birthyear, birthmonth - 1, birthday]), 'years');

      const body = {
        username: Helpers.firstUpper(value.username),
        email: Helpers.lowerCase(value.email),
        birthday: (value.bday),
         birthmonth: (value.month),
       birthyear: (value.month),
        password: hash,
       age:age
      };
      User.create(body)
        .then(user => {
          const token = jwt.sign({ data: user }, dbConfig.secret, {
            expiresIn: '5h'
          });
          res.cookie('auth', token);
          res
            .status(HttpStatus.CREATED)
            .json({ message: 'User created successfully', user, token });
        })
        .catch(err => {
          res
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .json({ message: 'Error occured' });
        });
    });
  },

Ошибка появляется, когда я отправляю кнопку регистрации на входе в командной строке, она показывает, что день рождения не определен, и показывает под этой строкой:

const age = moment().diff(moment([birthyear, birthmonth - 1, birthday]),

, который я поместил над телом и вставил age: age in body

Я уверен, что такая же ошибка произойдет и для других двух значений.Что случилось?Как мы можем это исправить?

1 Ответ

0 голосов
/ 12 декабря 2018

Вы никогда не определяли переменные birthyear, birthmonth или birthmonth где-либо в предоставленном вами коде, поэтому ошибка имеет смысл.

Я не знаком с проверкой объекта Joilib, которую вы используете, но видя, что value.password содержит пароль в вызове bcrypt выше, я думаю, вы можете получить доступ к этим полям как к свойствам value.Попробуйте это:

 const age = moment().diff(moment([value.birthyear, value.birthmonth - 1, value.birthday]), 'years');

Вероятно, вы получите похожие ошибки в блоке кода const body = {...}, так как вы используете имена свойств, отличные от определения вашей схемы, поэтому дважды проверьте, чтобы все строки value.* были исправленыте.

...