猿问

使用 NodeJs/Knex/Nodemailer 的忘记密码功能无法正常工作

注意:这是我第一次发帖,如果您有任何意见,请告诉我

目标:我正在构建一些端点,让用户在忘记密码时重设密码。流程看起来像这样:

  1. 用户不知道密码,所以他们点击忘记密码。

  2. 用户输入电子邮件并点击发送

  3. 用户收到带有重置密码链接的电子邮件。单击链接并被重定向以输入他们的新密码。

  4. 他们点击“保存”,他们被重定向到登录以使用他们的新密码登录

我正在使用 Insomnia 来达到测试的终点。

正在工作的事情:

  • 当提供电子邮件以重置密码时,Nodemailer 会发送一封电子邮件。

  • 更新密码时,它会显示“密码已更新”并给出 200 状态。

错误:

  • 尝试使用该新密码登录后,它不会保存到数据库中。只有旧密码才能让您重新登录。

我尝试过的事情:

  • 我尝试更改我的 user.model 以使用我的 findByEmail 函数并遇到了一些奇怪的错误,这让我陷入了困境。

  • 我尝试了控制台日志记录很多事情,看看我是否可以追踪路径。

  • 我尝试更改 user.update 函数,但无法使其正常工作。

这是我的代码: 任何指导将不胜感激。如果您需要查看任何其他文件,请告诉我。

忘记密码.js

const router = require('express').Router();

const crypto = require('crypto')

const User = require('../models/users.model')

const nodemailer = require('nodemailer')


router.post('/forgotpassword', (req, res) => {

  let {

    email

  } = req.body

  console.log(req.body)

  // if (req.body.email === '') {

  //   res.status(400).json({ message: 'Email is required'})

  // } console.error(req.body.email)

  User.findBy({

      email

    })

    .first()

    .then(user => {

      if (user === null) {

        res.status(403).json({

          message: 'Email not in db'

        })

      } else {

        const token = crypto.randomBytes(20).toString('hex')

        User.update({

          resetPasswordToken: token,

          resetPasswordExpires: Date.now() + 3600000,

        })

 

        const transporter = nodemailer.createTransport({

          service: 'gmail',

          auth: {

            user: `${process.env.EMAIL_USER}`,

            pass: `${process.env.EMAIL_PASS}`

          }

        })



Smart猫小萌
浏览 147回答 1
1回答

浮云间

你的User.update()线路没有运行(你要么需要将他们的承诺返回到承诺链中,要么挂钩到他们的回调中)。async/await是你的朋友在这里避免“回调地狱”。const user = await User.find({  where: {    username: req.body.username,    resetPasswordToken: req.body.resetPasswordToken,    resetPasswordExpires: Date.now() + 3600000,  }})if (!user) { /* ... */ }const token = crypto.randomBytes(20).toString('hex')await User.update({ // await here!  resetPasswordToken: token,  resetPasswordExpires: Date.now() + 3600000,})
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答