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

Next.js API路由中获取JWT Cookie并验证时的if语句报错问题

问题排查与解决:Next.js API中JWT解码email用于if判断报错

核心问题分析

你遇到的报错本质不是if语句本身的问题,而是没有提前处理Token不存在、无效,或解码后数据异常的情况,导致email变量在进入判断前就已经触发了错误。

具体排查方向与解决方法

  1. Token不存在时直接解码导致data为null
    当用户未登录或Cookie失效时,req.cookies.jwtToken会是undefined或null,此时调用jwt.decode(token)会返回null,再取data.email就会抛出Cannot read properties of null (reading 'email')错误。

    • 解决:先判断Token是否存在,再执行解码逻辑:
      const token = req.cookies.jwtToken;
      if (!token) {
        return res.json({msg: "You are not logged in! Please login first."})
      }
      const data = jwt.decode(token);
      
  2. Token无效/过期但decode仍返回不完整数据
    jwt.decode只做解码操作,不验证Token的签名和有效期——哪怕Token过期或被篡改,也可能返回部分数据,甚至缺失email字段。此时直接判断!email前,data可能已经是异常格式。

    • 解决:改用jwt.verify替代decode,同时捕获验证错误:
      import jwt from 'jsonwebtoken';
      
      const token = req.cookies.jwtToken;
      if (!token) {
        return res.json({msg: "You are not logged in! Please login first."})
      }
      
      let data;
      try {
        data = jwt.verify(token, process.env.JWT_SECRET); // 替换为你的JWT密钥
      } catch (err) {
        return res.json({msg: "Invalid or expired token. Please login again."})
      }
      
      const email = data.email;
      if (!email) {
        return res.json({msg: "Invalid token data. Please login again."})
      }
      // 后续创建笔记逻辑
      
  3. 快速排查验证步骤
    在代码中先打印token和data的完整值,确认数据状态:

    console.log('Token:', token);
    console.log('Decoded data:', data);
    

    通过日志确认Token是否存在、data是否包含email字段,避免因数据异常导致判断出错。

修正后的完整示例代码

import jwt from 'jsonwebtoken';

export default function handler(req, res) {
  const token = req.cookies.jwtToken;

  // 第一步:检查Token是否存在
  if (!token) {
    return res.status(401).json({msg: "You are not logged in! Please login first."})
  }

  let data;
  try {
    // 验证Token有效性,同时解码
    data = jwt.verify(token, process.env.JWT_SECRET);
  } catch (error) {
    return res.status(401).json({msg: "Invalid or expired token. Please login again."})
  }

  // 使用可选链避免data为undefined时报错
  const email = data?.email;
  if (!email) {
    return res.status(401).json({msg: "Invalid token data. Please login again."})
  }

  // 执行创建笔记逻辑
  // do something...

  res.status(200).json({msg: "Note created successfully", userEmail: email})
}

内容的提问来源于stack exchange,提问作者Saqlen Mehdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:23