axios发送POST请求无法传递auth token报422错误问题求助
问题原因
你的报错是客户端axios.post传参顺序错误导致的。axios.post的方法签名固定为 axios.post(url[, requestData[, requestConfig]]):
- 第一个参数是接口地址
- 第二个参数是POST请求要发送的请求体数据
- 第三个参数才是包含请求头、超时时间等配置的config对象
你当前的代码把存放headers的配置对象放在了第二个参数位置,这个对象会被axios当成请求体发送,根本不会被解析为请求配置,所以实际发出去的请求根本没有携带Authorization头,服务端校验不通过就返回了Please provide the token的422响应。
这也能解释为什么Postman请求可以成功:你在Postman里是把token放在专门的请求头配置项里传递的,参数位置符合服务端的读取规则。
修复方法
调整参数位置即可:如果这个接口不需要传递请求体内容,第二个参数传null,把带headers的配置放到第三个参数位置:
finally{ // 第二个参数传null代表无请求体,第三个参数才是请求配置 const auth = await axios.post(`/api/get-user`, null, { headers: { Authorization: `Bearer ${this.Token}` } }) }
可选优化建议
- 项目中如果有多个接口需要携带token鉴权,不建议每次请求手动写headers配置,可以给axios配置全局请求拦截器,自动给所有需要鉴权的请求注入Authorization头,避免重复代码和传参错误:
// 你的axios全局/实例配置 axios.defaults.baseURL = 'http://localhost:3001' // 你已配置的baseURL // 请求拦截器统一注入token axios.interceptors.request.use((config) => { const token = this.Token // 替换为你实际存储token的变量/本地存储取值逻辑 if (token) { config.headers.Authorization = `Bearer ${token}` } return config })
配置完成后,后续请求不需要再手动写headers,直接调用axios.post('/api/get-user')即可自动携带token。
- 你当前服务端的jwt校验逻辑缺少异常捕获,当token伪造、过期时,
jwt.verify会直接抛出未捕获异常导致接口返回500错误,建议补充try/catch处理,校验失败时返回401状态码,这个和你当前遇到的422问题无关,可以后续迭代优化。
内容的提问来源于stack exchange,提问作者DMantas
相关产品推荐
相关产品推荐

