使用Next.js解析JWT遇‘jwt must be provided’错误,求排查
排查Next.js中JWT报错“error: jwt must be provided”的问题
这个错误的核心原因是调用jwt.verify()时传入的token为空字符串,以下是具体排查和修复步骤:
1. 确认Cookie名称是否匹配
你的代码中从名为secret的Cookie里取token:
const token = request.cookies.get('secret')?.value||''
请检查登录时设置JWT的Cookie键名是否和secret完全一致——实际开发中常用的键名是token、authToken等,若名称不匹配,自然取不到有效token。
2. 检查Cookie是否被正确携带
- 打开浏览器开发者工具,切换到Application > Cookies,查看目标域名下是否存在对应键名的Cookie,且值不为空。
- 若客户端通过fetch/axios发起请求,需确保请求配置携带凭证:
// fetch示例 fetch('/api/me', { credentials: 'include' }) // axios示例 axios.get('/api/me', { withCredentials: true }) - 查看请求头的
Cookie字段,确认包含目标键值对。
3. 提前处理空token场景
当前代码中token为空时会传入空字符串给jwt.verify(),直接触发错误。建议在验证前先判断token是否存在,抛出更明确的错误:
修改getMyData.ts:
import { NextRequest } from "next/server"; import jwt from 'jsonwebtoken'; export const GetDataFromToken = (request:NextRequest)=>{ try { const token = request.cookies.get('secret')?.value; // 新增空值判断 if (!token) { throw new Error('未在Cookie中找到JWT token'); } const decodeToken: any = jwt.verify(token,'secretvslueforauth') return decodeToken.id } catch (error: any) { throw new Error(error.message) } }
4. 修正不必要的await调用
GetDataFromToken是同步函数,me.ts中无需用await调用,直接改为:
const userId = GetDataFromToken(request);
5. 检查数据库查询字段是否正确
若使用MongoDB,用户模型默认的ID字段是_id,但你的代码中用findOne({ id: userId })查询,这会导致无法匹配到用户。需改为:
const user = await User.findOne({ _id: userId }).select("-password");
若你的用户模型自定义了id字段,则忽略此条。
内容的提问来源于stack exchange,提问作者Muhammad Usman
相关产品推荐
相关产品推荐

