Next.js API中req.query初始为undefined的解决办法
针对你遇到的首次加载时 req.query.id 和 Cookie 值均为 undefined,导致验证逻辑不符合预期的问题,提供以下几种可行的解决思路:
1. 先校验值的存在性再做相等判断
直接判断 undefined === undefined 会返回 true,这显然不符合业务逻辑(此时用户并未完成任何身份关联操作)。因此需要先确保两个值都有效,再进行相等验证:
export default async function handler(req, res) { const { method } = req; const userId = req.query.id; const userCookieId = req.cookies?.uid || req.cookies?.guestId; // 仅当两个值都不为 undefined 时,才验证是否相等,否则 authUser 为 false const authUser = userId !== undefined && userCookieId !== undefined && userId === userCookieId; }
2. 针对首次加载场景做特殊处理
如果首次加载是正常业务流程(比如用户刚进入页面),可以主动初始化 Cookie 或返回明确的响应,避免无效验证:
export default async function handler(req, res) { const { method } = req; const userId = req.query.id; const userCookieId = req.cookies?.uid || req.cookies?.guestId; // 无 query 参数时,处理首次加载逻辑 if (!userId) { // 若 Cookie 也未初始化,生成随机 guestId 并存入 if (!userCookieId) { const newGuestId = Math.random().toString(36).slice(2, 12); res.setHeader('Set-Cookie', `guestId=${newGuestId}; Path=/; HttpOnly; SameSite=Lax`); } // 返回初始化完成的响应,无需进行身份验证 return res.status(200).json({ authUser: false, status: 'initialized' }); } // 存在 query 参数时,执行正常验证逻辑 const authUser = userId === userCookieId; res.status(200).json({ authUser }); }
3. 增加边界值校验(避免空字符串等无效值)
除了 undefined,还需要防范空字符串、纯空格等无效值导致的误判:
export default async function handler(req, res) { const { method } = req; // 去除参数首尾空格,避免空字符串干扰 const userId = req.query.id?.trim(); const userCookieId = (req.cookies?.uid?.trim() || req.cookies?.guestId?.trim()); // 校验是否为有效非空值 const isUserIdValid = userId !== undefined && userId !== ''; const isCookieIdValid = userCookieId !== undefined && userCookieId !== ''; const authUser = isUserIdValid && isCookieIdValid && userId === userCookieId; }
内容的提问来源于stack exchange,提问作者Omilight
相关产品推荐
相关产品推荐

