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

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;

其他潜在问题(需同步修复)

  1. Knex查询结果判断逻辑错误
    knex的where方法返回数组,即使无匹配用户也会返回空数组而非null,原代码if (!user)永远不会触发。需改为判断数组长度:
// 原代码
if (!user) { ... }
// 修正后
if (user.length === 0) { ... }
  1. 响应发送重复问题
    原代码中res.sendStatus(401).json(...)存在错误,sendStatus会直接结束请求,后续json无法生效,应改为:
return res.status(401).json({ message: "Something went wrong." });

内容的提问来源于stack exchange,提问作者Ives E.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:35:23