为何Axios返回Z_BUF_ERROR?Discord OAuth2请求异常排查
Discord OAuth2令牌接口调用出现Z_BUF_ERROR的解决办法
遇到的错误信息:
cause: Error: unexpected end of file
at BrotliDecoder.zlibOnError [as onerror] (node:zlib:189:17) {
errno: -5,
code: 'Z_BUF_ERROR'
这个错误本质是响应数据解压失败,大概率和Discord API启用的Brotli压缩有关——之前代码正常现在报错,可能是Discord调整了压缩策略,或者你的Axios版本存在兼容问题。下面是几种可行的解决方法:
方法1:禁用响应压缩
强制Discord返回未压缩的原始数据,跳过解压环节。修改请求headers,添加Accept-Encoding: identity:
export async function getCredentials(req: Request, res: Response) { const { code } = req.query; const params = new URLSearchParams({ client_id: process.env.CLIENT_ID as string, client_secret: process.env.CLIENT_SECRET as string, grant_type: "authorization_code", code: code as string, redirect_uri: "http://localhost:3000/api/callback", }); const response = await axios.post( "https://discord.com/api/oauth2/token", params, { headers: { "Content-Type": "application/x-www-form-urlencoded", "Accept-Encoding": "identity" // 新增这一行 }, } ); res.json(response.data); // response.data本身是解析后的对象,无需await }
方法2:更新Axios到最新版本
旧版Axios在处理Brotli压缩时可能存在bug,执行命令更新:
npm update axios # 或者用yarn yarn upgrade axios
方法3:手动处理响应解压
如果禁用压缩无效,可以关闭Axios自动解压,自己手动处理数据:
import zlib from 'zlib'; import { promisify } from 'util'; const brotliDecompress = promisify(zlib.brotliDecompress); export async function getCredentials(req: Request, res: Response) { const { code } = req.query; const params = new URLSearchParams({ client_id: process.env.CLIENT_ID as string, client_secret: process.env.CLIENT_SECRET as string, grant_type: "authorization_code", code: code as string, redirect_uri: "http://localhost:3000/api/callback", }); const response = await axios.post( "https://discord.com/api/oauth2/token", params, { headers: { "Content-Type": "application/x-www-form-urlencoded", "Accept-Encoding": "br" // 明确接受Brotli压缩 }, decompress: false // 关闭Axios自动解压 } ); // 手动解压响应数据 const decompressedData = await brotliDecompress(response.data); const result = JSON.parse(decompressedData.toString()); res.json(result); }
另外还要排查几个基础问题:
- 确认
CLIENT_ID和CLIENT_SECRET环境变量配置正确 - 检查Discord开发者后台的
redirect_uri和代码里的完全一致 - 确保授权码
code没有过期或重复使用(授权码只能用一次)
内容的提问来源于stack exchange,提问作者Mohammed Ahmed
相关产品推荐
相关产品推荐

