如何在前端Node js中获取重置密码api

how to fetch reset password api in front-end Node js

我是网络开发专业的学生。目前,我正在尝试构建一个基本项目,我正在努力实现重置密码功能,我真的需要帮助来了解如何使用 Axios 在前端获取重置密码 API。简而言之,我实现的重置密码 API 在 Postman 上运行良好,但每当我尝试在前端传递并获取 API 以使用户能够输入他们的新密码和 passwordValidation 我有点迷路,下面我分享我的代码片段:

后台代码重置密码

resetPassword = async(req, res) => {
  try {
    // Step 1: Get user based on the token
    const validateHashedToken = crypto
                              .createHash('sha256')
                              .update(req.params.token)
                              .digest('hex');

    const user = await User.findOne(
                { 
                  passwordResetToken: validateHashedToken,
                  passwordResetExpires: { $gt: Date.now() }
                });
    
    user.password = req.body.password;
    user.passwordValidation = req.body.passwordValidation;
    user.passwordResetToken = undefined;
    user.passwordResetExpires = undefined;
    await user.save();

    // Step 3: Update the "passwordChangedAt" date
    // Step 4: Log the user in and send a JWT
    genResJWT(user, 200, res);

  } catch (error) {
    console.log('error', error)
  }
};

路线:

router
  .route('/api/v1/users/resetpassword/:token')
  .get(viewsController.getResetPasswordUrl)
  .patch(viewsController.resetpassword);

控制器

exports.getResetPasswordUrl = async(req, res) => {
  try {
    const { token } = req.params.token;
    const validToken = await User.findOne(
      { 
        passwordResetToken: token
      }
    );

    res.status(200).render('resetPassword',
      {
    title: 'resetpassword',
    token: validToken
      });
  } catch (error) {
    console.log(error);
  }
};

exports.resetpassword = (req, res) => {
  // I'm stack here and I really need help
  res.status(200).render('profile', {
    title: 'reset password successfuly'
  });
};

前端抓取api代码:

import axios from 'axios';

export const resetPassword = async (password, passwordValidation) => {
  try {
    const res = await axios({
      method: 'PATCH',
      url:
        `http://127.0.0.1:3000/api/v1/users/resetpassword/:token`,
      data: {
        password,
        passwordValidation
      }
    });

    if (res.data.status === 'success') {
      window.setTimeout(() => {
    location.replace('/me');
      }, 500);
    }
  } catch (error) {
    console.log('error', error.response.data.message);
  }
};

在前端,您正在向 http://127.0.0.1:3000/api/v1/users/resetpassword/:token 发出请求。由于 token 是路由参数,因此您直接传入字符串 ":token" 而不是令牌的实际值。

试试这个:

const res = await axios({
    method: 'PATCH',
    url:
        `http://127.0.0.1:3000/api/v1/users/resetpassword/${token}`,
    data: {
        password,
        passwordValidation
    }
  });

其中 token 是您需要定义的变量。

假设你使用的是express,这里有一些关于参数路由的文档:https://expressjs.com/en/guide/routing.html#route-parameters

我通过以下步骤解决了我的问题:

1- 在我的“/resetpassword/:token”路由中仅使用 GET 请求,并使用 Axios 提交 PATCH 请求。

2- 传递 'token' 以及 'password' 和 'passwordValidation' 作为 PATCH 请求中的输入数据。

3- 在 'resetPassword' 表单中创建隐藏输入,以便在用户确认更新后的密码时提交 'token' 密码和 'passwordValidation'。

下面是我的代码片段,用于解释解决方案:

路线:

router.get(
  '/resetpassword/:token',
  viewsController.resetPassword
  )

控制器

exports.resetPassword = (req, res) => {
  const token = req.params.token;
  res.status(200).render('/login', {
    title: 'reset password successfuly', { token }
  });
};

front-end 获取 API 代码:

import axios from 'axios';

export const resetPassword = async (password, passwordValidation, token) => {
  try {
    const res = await axios({
      method: 'PATCH',
      url:
        `/api/v1/users/resetpassword/${token}`,
      data: {
        password,
        passwordValidation
      }
    });

    if (res.data.status === 'success') {
      window.setTimeout(() => {
        location.assign('/login');
      }, 1000);
    }
  } catch (error) {
    console.log('error', error.response.data.message);
  }
};

重置密码形式:

extends goaheadtravel


block content
  main.main
    .resetpassword-form
      h2.heading-secondary.ma-bt-lg Please enter a new password and validate it
      form.form.resetpassword--form
        .form__group.ma-bt-md
          label.form__label(for='password') Password
          input#password.form__input(type='password' placeholder='••••••••' required='' minlength='8')
        .form__group.ma-bt-md
          label.form__label(for='passwordValidation') Confirm password
          input#passwordValidation.form__input(type='password' placeholder='••••••••' required='' minlength='8')
          input#resetToken(type='hidden' value=`${token}`)
        .form__group.right
          button.btn.btn--green Confirm new password

希望我的解决方案对其他开发者有所帮助!