Next.js中Nodemailer发送的账户验证链接出现404错误求助
账户验证链接404错误的问题分析与修复
核心问题1:请求方法不匹配
用户点击邮件中的链接时,浏览器会发起GET请求,但你的验证接口/api/verification/[id].js仅配置了handler.post处理POST请求,这是触发404的直接原因。
修正方式:
将接口改为处理GET请求(适配浏览器点击链接的场景),或同时支持两种请求方法:
// /api/verification/[id].js handler.get(async (req, res) => { try { const user = await knex("User").where("id", req.query.id); if (user.length === 0) { return res.status(401).json({ message: "用户不存在或验证链接无效" }); } await knex("User") .update({ status: "active", date: new Date() }) .where("id", req.query.id); const redirectPath = process.env.NEXT_PUBLIC_REDIRECT_VERIFICATION; res.redirect(redirectPath); } catch (err) { res.status(500).json({ message: "Something went wrong" }); } });
核心问题2:环境变量名错误
生成验证链接时使用了重复的环境变量名:
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL_BASE_URL;
变量名中重复了_BASE_URL,会导致生成的链接域名/路径无效,进而触发404。
修正方式:
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL;
其他潜在问题(需同步修复)
- Knex查询结果判断逻辑错误
knex的where方法返回数组,即使无匹配用户也会返回空数组而非null,原代码if (!user)永远不会触发。需改为判断数组长度:
// 原代码 if (!user) { ... } // 修正后 if (user.length === 0) { ... }
- 响应发送重复问题
原代码中res.sendStatus(401).json(...)存在错误,sendStatus会直接结束请求,后续json无法生效,应改为:
return res.status(401).json({ message: "Something went wrong." });
内容的提问来源于stack exchange,提问作者Ives E.
相关产品推荐
相关产品推荐

