Javascript 忘记了使用NodeJs/Knex/nodeEmailer的密码功能,它无法正常工作

Javascript 忘记了使用NodeJs/Knex/nodeEmailer的密码功能,它无法正常工作,javascript,node.js,knex.js,nodemailer,Javascript,Node.js,Knex.js,Nodemailer,注意:这是我第一次发帖,如果你有反馈,请让我知道 目标:我正在构建一些端点,允许用户在忘记密码时重置密码。流量如下所示: 用户不知道密码,所以他们单击“忘记密码” 用户键入电子邮件并单击发送 用户收到带有重置密码链接的电子邮件。点击链接并被重定向以输入新密码 他们单击“保存”,并被重定向到登录,以使用新密码登录 我用失眠来达到测试的终点 有效的东西: 当提供电子邮件重置密码时,NodeEmailer会发送电子邮件 更新密码时,它会显示“密码已更新”,并给出200状态 错误: 尝试使用该新密

注意:这是我第一次发帖,如果你有反馈,请让我知道

目标:我正在构建一些端点,允许用户在忘记密码时重置密码。流量如下所示:

  • 用户不知道密码,所以他们单击“忘记密码”
  • 用户键入电子邮件并单击发送
  • 用户收到带有重置密码链接的电子邮件。点击链接并被重定向以输入新密码
  • 他们单击“保存”,并被重定向到登录,以使用新密码登录
  • 我用失眠来达到测试的终点

    有效的东西:

    • 当提供电子邮件重置密码时,NodeEmailer会发送电子邮件
    • 更新密码时,它会显示“密码已更新”,并给出200状态
    错误:

    • 尝试使用该新密码登录后,它不会保存到数据库。只有旧密码才允许您重新登录
    我尝试过的事情:

    • 我试图更改我的user.model以使用findByEmail函数,但遇到了一些奇怪的错误,这让我陷入了一个棘手的问题中
    • 我试着用控制台记录了很多东西,看看是否可以追踪路径
    • 我尝试更改user.update函数,但无法使其正常工作
    这是我的代码: 任何指导都将不胜感激。如果你需要查看任何其他文件,请告诉我

    .password.js

    const router=require('express').router();
    const crypto=require('crypto')
    const User=require(“../models/users.model”)
    const nodemailer=require('nodemailer')
    路由器.post('/forgotpassword',(req,res)=>{
    让{
    电子邮件
    }=请求正文
    控制台日志(请求正文)
    //如果(req.body.email===''){
    //res.status(400).json({message:'Email是必需的'})
    //}console.error(req.body.email)
    User.findBy({
    电子邮件
    })
    .first()
    。然后(用户=>{
    如果(用户===null){
    res.status(403).json({
    消息:“电子邮件不在数据库中”
    })
    }否则{
    const token=crypto.randomBytes(20).toString('hex'))
    User.update({
    resetPasswordToken:token,
    resetPasswordExpires:Date.now()+3600000,
    })
    const transporter=nodemailer.createTransport({
    服务:“gmail”,
    认证:{
    用户:`${process.env.EMAIL\u user}`,
    通过:`${process.env.EMAIL\u pass}`
    }
    })
    常量邮件选项={
    发件人:“${process.env.EMAIL\u USER}”,
    收件人:“${user.email}”,
    主题:“[Promoquo]重置密码链接”,
    text:'您收到此消息是因为您(或其他人)已请求重置您帐户的密码。\n\n'+
    '请单击以下链接,或将其粘贴到浏览器中,以便在收到该链接后一小时内完成此过程:\n\n'+
    `http://localhost:5000/reset/${token}\n\n`+
    '如果您没有请求,请忽略此电子邮件,您的密码将保持不变。\n',
    }
    transporter.sendMail(mailpoptions,(err,res)=>{
    如果(错误){
    log('来自忘记密码js的错误,它很糟糕',错误)
    }否则{
    log('这里是res',res)
    res.status(200).json({
    消息:“已发送恢复电子邮件,是”
    })
    }
    })
    }
    res.status(200).json({
    消息:“重置密码电子邮件已发送WOOHOO您的
    用户。update()
    行未运行(您需要将其承诺返回到承诺链中,或挂接到其回调中)。
    async/wait
    是您的朋友,以避免“回调地狱”


    非常感谢您的回复。我将尝试添加async/Wait,看看会发生什么。您能否澄清一下在MongoDB中使用未初始化的体参数的意思。我没有使用MongoDB,我使用的是SQlite3。感谢您的帮助!我在这方面绝对是新手。已经编写了大约一年的代码。@RyanRenteria没有问题。使用SQlite3我想您是对的We’很好——我错误地假设了MongoDB,对不起。哦,好吧,明白了!非常感谢您的帮助。我今天将对此进行研究,看看会发生什么。:)实际上,还有一个问题。我需要在忘记.password.js和更新.password.js中使用async/await,还是只使用某一个?您应该
    await
    所有数据库操作。这会将结果提交给数据库,这样您就知道(1)数据库成功应用了它,没有模式冲突阻止它保存,等等。(2)不存在并发问题,例如,您无法查询用户并获取过时数据。
    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,
    })