发送验证邮件时出现Internal Server Error问题求助
发送验证邮件时触发内部服务器错误的排查请求
问题描述
给新用户发送验证邮件时,点击触发按钮后出现Internal Server Error(内部服务器错误),请求协助排查并修复该问题。
报错截图
- 错误提示截图:

- 错误详情截图:

备注:发送验证邮件时出现内部服务器错误
触发按钮截图

实现代码
// 发送验证邮件 const sendVerificationEmail = asyncHandler(async (req, res) => { const user = await User.findById(req.user._id); if (!user) { res.status(404); throw new Error("用户未找到"); } if (user.isVerified) { res.status(400); throw new Error("用户已验证"); } // 如果数据库中存在旧令牌则删除 let token = await Token.findOne({ userId: user._id }); if (token) { await token.deleteOne(); } // 创建验证令牌并保存 const verificationToken = crypto.randomBytes(32).toString("hex") + user._id; console.log(verificationToken); // 哈希令牌并保存到数据库 const hashedToken = hashToken(verificationToken); await new Token({ userId: user._id, vToken: hashedToken, createdAt: Date.now(), expiresAt: Date.now() + 60 * (60 * 1000), // 有效期60分钟 }).save(); // 构建验证链接 const verificationUrl = `${process.env.FRONTEND_URL}/verify/${verificationToken}`; // 发送验证邮件 const subject = "验证您的账户 - PrimeLodge"; const send_to = user.email; const sent_from = process.env.EMAIL_USER; const reply_to = "noreply@primelodge.com"; const template = "verifyEmail"; const name = user.name; const link = verificationUrl; try { await sendEmail( subject, send_to, sent_from, reply_to, template, name, link ); res.status(200).json({ message: "邮件已发送" }); } catch (error) { console.error(error); // 打印错误日志 res.status(500).json({ error: "邮件发送失败,请重试" }); } });
排查与修复方向
- 检查未定义依赖:确认
crypto模块是否正常引入(Node.js默认自带,需确保未误删);确认hashToken函数已正确定义,参数传递是否符合函数要求。 - 数据库操作校验:检查
Token模型的字段定义是否与代码匹配(比如vToken是否为字符串类型、expiresAt是否设置正确);确认数据库连接正常,操作权限无问题。 - 环境变量验证:检查
process.env.FRONTEND_URL和process.env.EMAIL_USER是否已正确配置,缺失会导致链接拼接或邮件发送失败。 - sendEmail函数排查:核对邮件服务商的SMTP配置是否正确;确认
verifyEmail模板存在;检查sendEmail的参数顺序是否与函数定义一致,避免参数错位引发错误。 - 查看完整错误日志:服务器端的错误栈日志能定位具体出错行,比如是哈希令牌、保存令牌还是发送邮件环节出问题,优先查看这部分内容。
内容的提问来源于stack exchange,提问作者Cynos 28
相关产品推荐
相关产品推荐

