You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS密码重置功能遇Promise.resolve返回undefined问题求助

Node.js密码重置功能中Promise返回undefined的问题排查

你的问题核心出在emailProcessor函数——它调用了返回Promise的sendEmail,但没有返回这个Promise。JavaScript函数如果没有显式return语句,默认返回undefined,所以你在主路由里await emailProcessor(...)得到的自然是undefined。

修复步骤

1. 让emailProcessor返回Promise

修改emailProcessor,添加return语句传递sendEmail的Promise:

const emailProcessor = (email, pin) => {
  const info = {
    from: '"app" <email>',
    to: email,
    subject: "Reset Pin",
    text: "Pin is " + pin,
    html: `<b>Reset Pin</b><b>${pin}`,
  }
  // 关键:返回sendEmail的Promise
  return sendEmail(info)
}

2. 完善sendEmail的错误处理

原sendEmail函数捕获错误后没有reject,会导致邮件发送失败时Promise静默结束,无法被主函数捕获。需在catch块中添加reject(error):

const sendEmail = (info) => {
  return new Promise(async (resolve, reject) => {
    try {
      let result = await transporter.sendMail(info);
      console.log("Message sent: %s", result.messageId);
      console.log("Preview URL: %s", nodemailer.getTestMessageUrl(result));
      resolve(result)
    } catch (error) {
      console.log(error)
      // 将错误传递给调用方
      reject(error)
    }
  })
}

3. 主路由添加全局错误捕获

避免未处理的Promise rejection,将核心逻辑包裹在try/catch中,同时修正HTTP状态码(原状态码不符合规范):

router.post('/reset-password', async (req, res) => {
  try {
    const { email } = req.body
    const emailCheck = await db.query('SELECT EXISTS (SELECT email from tickets where email=$1)', [email])
    const ifExist = Object.values(emailCheck.rows[0])[0]

    if (ifExist) {
      const resetPin = Math.floor(100000 + Math.random() * 900000)
      await db.query('UPDATE tickets SET pin=$1 where email=$2', [resetPin, email])
      const result = await emailProcessor(email, resetPin)

      console.log(result) // 现在会返回邮件发送的result对象

      return res.status(200).json({
        status: 'success',
        message: 'Pin sent to your email'
      })
    }

    res.status(404).json({
      status: 'error',
      message: 'Email not found in our database'
    })
  } catch (error) {
    console.error('Reset password error:', error)
    res.status(500).json({
      status: 'error',
      message: 'Failed to process your request'
    })
  }
})

内容的提问来源于stack exchange,提问作者LearningToCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:45:43