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

使用JWT保护API时出现'done is not a function'错误求助

解决express-jwt中'done is not a function'错误及普通用户POST权限控制问题

错误原因

你遇到的done is not a function报错,核心问题是express-jwt v7及以上版本废弃了isRevoked的回调函数写法。旧版本中isRevoked通过done回调返回结果,但新版本要求该函数返回Promise(或直接返回布尔值,async函数默认返回Promise),你的代码沿用了旧写法,导致参数不匹配触发错误。

修复方案

1. 修改isRevoked函数

删除done参数,直接返回布尔值判断结果:

async function isRevoked(req, payload) {
  // 非管理员用户返回true,令牌被吊销,拒绝访问
  return !payload.isAdmin;
}

逻辑说明:

  • 当payload.isAdmin为false(普通用户),返回true,express-jwt会拦截请求
  • 当payload.isAdmin为true(管理员),返回false,允许请求通过

2. 验证权限控制逻辑

当前的unless配置已经正确开放了无需认证的接口:

  • 产品、分类接口的GET/OPTIONS请求
  • 用户登录、注册、重置密码接口

修复后,普通用户发起POST请求会被isRevoked拦截,符合你禁止普通用户POST的需求。

3. 测试验证

  • 用普通用户令牌发起POST请求:应返回401/403权限错误,不再出现函数报错
  • 用管理员令牌发起POST请求:应正常处理请求

额外注意事项

  • 确保JWT令牌的payload中包含isAdmin字段,且值为布尔类型(true/false)
  • 检查环境变量JWT_SECRET和API_URL是否正确加载,避免因配置缺失引发其他问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:24:26