当前位置: 首页 > 知识库问答 >
问题:

如何保存重置密码Nodejs和MongoDb

翟沈义
2023-03-14

我使用SendGrid向用户发送带有两个参数(用户id和令牌)的重置密码链接。我有另一个组件可以保存用户更改的密码,但我得到的只是一个错误用户。保存不是一个函数

电子邮件帮助程序代码。

import sendGrid from "@sendgrid/mail";

export class sendGridEmail {
  static async sendResetPasswordEmail(email, token, id) {
    sendGrid.setApiKey(process.env.SENDGRID_API_KEY);
    const msg = {
      to: `${email}`,
      from: `${process.env.VERIFIED_SENDER}`, // Change to your verified sender
      subject: "RESET YOUR PASSWORD",
      text: `Follow this link to reset your password: ${process.env.BASE_URL}/${id}/${token}`,
    };
    return sendGrid
      .send(msg)
      .then(() => {
        console.log(`password rest link has been sent to: ${email}`);
      })
      .catch((err) => {
        console.log(err);
      });
  }

SendLink组件

export const resetUserPassword = asynchandler(async (req, res) => {
  const { email } = req.body;
  const user = await userModel.findOne({ email });
  if (!user) {
    res.status(404);
    res.json({ message: "the email provided was not found" });
  } else if (user) {
    const token = AuthToken(user._id);
    try {
      await sendGridEmail.sendResetPasswordEmail(user.email, token, user._id);
      res.status(200);
      res.json({
        message: `a link to reset your password has been sent to: ${user.email}`,
      });
    } catch (error) {
      res.status(500);
      res.json({ message: error });
    }
  } else {
    res.status(500);
    res.json({ message: "Internal Server Error" });
  }
});

尝试更新数据库中的密码但我得到错误的组件user.save()不是函数

export const saveResetPassword = asynchandler(async (req, res) => {
  const { id, authorization } = req.params;

  const user = userModel.findOne(req.params.id);
  const private_key=process.env.PRIVATE_KEY
  const payload = jwt.verify(authorization, private_key);
  if (user._id === id || payload.id) {
    try {
      user.password = req.body.password;
      await user.save();
    } catch (error) {
      res.status(404);
      res.json({ message: `an error occured: ${error}` });
    }
  }else{
    res.status(500)
    res.json({message: "an error occured"})
  }
});

我的路线

import { loginUser, registerUser, resetUserPassword, saveResetPassword } from "./controllers/user.controller.js";

export const Routes =(app)=>{
    app.get("/health", (req,res) => {
        res.send(200).json({message:"Server health check is Ok"});
    });
    // user api's
    app.post('/api/registeruser', registerUser);
    app.post('/api/loginuser', loginUser);
    app.post('/api/password-reset', resetUserPassword);
    app.post("/api/save-password/:id/:authorization", saveResetPassword);

}
            

共有1个答案

袁鹤轩
2023-03-14
const user = await userModel.findOne(req.params.id);

你忘了等待,模特。findOne()返回promise

 类似资料:
  • 我想在Git扩展,Sourcetree或任何其他Git GUI中使用自动推拉,而无需在提示中输入用户名和密码,每次。 那么,如何在Git中保存凭据?

  • 试图通过管理员更改我的数据库密码。在尝试登录时突然更新密码不起作用。如何重置管理员数据库密码。

  • 介绍 {tip} 想要快速上手? 只需在一个新的 Laravel 应用中运行 php artisan make:auth 命令,然后在浏览器中访问 http://your-app.dev/register 或分配给应用的任何别的 URL。这条命令将搭建起整个身份验证系统,包括重置密码! 大多数 Web 应用都为用户提供了重置密码的功能。相比强迫你在每个应用中都要重实现一遍此功能,Laravel 提

  • 问题内容: 嘿,我正在使用一个具有如下登录对话框的Web应用程序: 用户点击“登录” 登录表单HTML随AJAX一起加载,并在第DIV页上显示 用户在字段中输入用户/密码,然后单击提交。不是-用户/密码通过AJAX提交 如果用户/密码正确,则页面将在用户登录后重新加载。 如果用户/密码不正确,则不会重新加载页面,但DIV中会显示错误消息,并且用户可以重试。 问题出在这里:浏览器从不提供通常针对其他

  • 我有一个SpringBoot(1.5.6),带有SpringSecurity(4.2)和ThymeLeaf应用程序,允许用户重置密码。所有html页面都在src/resources/templates中。基本流程是: > 用户提供用户名(通过resetPage.html) 凭证已清除 生成令牌并通过电子邮件发送到用户名电子邮件 用户单击电子邮件中的url将重定向到重置密码页面(changePass

  • 我们已经讲解完了,如果创建,注册用户,激活,修改,删除用户了,看似已经全了,但是我们还缺了一点 那就是为用户提供重置密码! 这个是一个网站必不可少的功能之一吧 我们重置密码,在 sentry 中分成 两步 1、发送 重置代码给用户 2、验证 重置代码,成功则修改密码 首先我们看 第一步 获取重置密码的代码 try { // 根据 email 查找用户 $user = Sentry: