Я не могу обновить информацию о пользователях, чтобы добавить ссылку для сброса пароля

#mongodb #express #mongoose #jwt #lodash

#mongodb #экспресс #mongoose #jwt #Lodash

Вопрос:

У меня возникли проблемы с получением переменной в базе данных пользователя для обновления с помощью Lodash. Похоже, что она обновляется по одному маршруту (пароль в / resetpassword), но не по другому. (Ссылка для сброса в / forgotpassword)

Мне нужно обновить «resetLink» до нового токена, сгенерированного JWT, чтобы создать ссылку для сброса пароля пользователя.

/ forgotpassword

 router.put('/forgotpassword', (req, res) => {
  const { email } = req.body;
  if (!email) {
    return res.status(400).json({ msg: "Please enter all fields" });
  } else {
    // Find existing User by email address
    User.findOne({ email }).then((user) => {
      if (!user) return res.status(400).json({ msg: "That email doesn't exist with us..." });
      const payload = {
        id: user._id,
      }
      const secret = process.env.JWT_SECRET;
      const token = jwt.sign(payload, secret, {
        expiresIn: '15m'
      });
      const obj = {
        resetLink: token
      }
      console.log("obj is "   JSON.stringify(obj));
      console.log("User is "   user);
      user = _.extend(user, obj);
      user.save((err, result) => {
        if (err) {
          return res.status(400).json({{ error: "Something went wrong..."   err }});
        } else {
          return res.status(200).json({ msg: "Success! These should match: TOKEN - "   token   " / RESET LINK - "   user.resetLink })
        }
      })
    });
  };
});
  

/resetpassword

 router.put('/resetpassword', (req, res) => {
  const { resetLink, newPass } = req.body;
  if (resetLink) {
    jwt.verify(resetLink, process.env.JWT_SECRET, function (err, decodedData) {
      if (err) {
        return res.status(401).json({ msg: "Incorrect token or it is expired." });
      }
      User.findOne({ resetLink }, (err, user) => {
        if (err || !user) {
          return res.status(400).json({ error: "User with this token doesn't exist" });
        }
        // newPass will be hashed by jwt eventually
        const obj = {
          password: newPass
        }

        user = _.extend(user, obj);
        user.save((err, result) => {
          if (err) {
            return res.status(400).json({ error: "Reset password error" });
          } else {
            return res.status(200).json({ message: "Your password has been changed" });
          }
        })
      })
    })
  } else {
    return res.status(401).json({ error: "Authentication error!" });
  }
});
  

Пользовательская модель Mongoose

 const UserSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
    lowercase: true,
  },
  password: {
    type: String,
    required: true,
  },
  register_date: {
    type: Date,
    default: Date.now,
  },
  resetLink: {
    data: String,
    default: '',
  }
});
  

Как всегда, я ценю любую помощь вообще. Спасибо.

РЕДАКТИРОВАТЬ: вот возвращаемая ошибка —

 "error": "Something went wrong...ValidationError: resetLink: Cast to Object failed for value "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjVmM2JjN2MwNGVmMmRkNGE2ODkwZDEwYiIsImlhdCI6MTU5Nzc1NDY2MCwiZXhwIjoxNTk3NzU1NTYwfQ.BL8yYsqk2A5hGlNTPa2AxtD_iJ1lWELiCgtpcCkFB6I" at path "resetLink""
  

Ответ №1:

Моя схема была отключена. Извиняюсь.

 resetLink: {
data: String,
default: '',
}
  

Должно быть:

 resetLink: {
Type: String,
default: '',
}