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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:55:04