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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:20:39