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
相关产品推荐
相关产品推荐

