使用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
相关产品推荐
相关产品推荐

