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

如何将Google UserInfo API返回的二进制数据转为Node.js对象?

解决Google UserInfo API返回gzip压缩二进制数据的问题

你收到的'\x1F�\b\x00\x00\x00\x00\x00\x02�U��j�0\x10E��\n'是gzip压缩格式的二进制数据,直接用Buffer转换自然得不到有效JSON,因为数据还处于压缩状态。下面是具体的解决思路和实现方法:

一、手动解压已获取的压缩数据

用Node.js内置的zlib模块对压缩数据进行gzip解压,再解析为JSON对象:

const zlib = require('zlib');

// 假设你已获取到压缩的二进制数据rawData
zlib.gunzip(Buffer.from(rawData), (err, decompressedBuf) => {
  if (err) {
    console.error('解压失败:', err);
    return;
  }
  // 转成字符串后解析为JSON对象
  const userInfo = JSON.parse(decompressedBuf.toString('utf8'));
  console.log(userInfo);
});

如果用async/await风格,可以封装成Promise:

const zlib = require('zlib');
const { promisify } = require('util');
const gunzip = promisify(zlib.gunzip);

async function parseCompressedUserInfo(rawData) {
  const decompressedBuf = await gunzip(Buffer.from(rawData));
  return JSON.parse(decompressedBuf.toString('utf8'));
}

// 使用示例
const userInfo = await parseCompressedUserInfo(rawData);

二、让服务器直接返回明文JSON

在请求UserInfo接口时,通过Accept-Encoding请求头告知服务器不要返回压缩数据,直接返回明文:

用axios请求的示例:

const axios = require('axios');

async function getUserInfo(accessToken) {
  const res = await axios.get('https://www.googleapis.com/oauth2/v3/userinfo', {
    headers: {
      'Authorization': `Bearer ${accessToken}`,
      'Accept-Encoding': 'identity' // 要求服务器返回未压缩数据
    }
  });
  return res.data; // 直接拿到JSON对象
}

用node-fetch请求的示例:

const fetch = require('node-fetch');

async function getUserInfo(accessToken) {
  const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', {
    headers: {
      'Authorization': `Bearer ${accessToken}`,
      'Accept-Encoding': 'identity'
    }
  });
  return res.json(); // 直接解析为JSON对象
}

为什么之前的Buffer转换无效?

Buffer只是将原始二进制数据封装为Node.js可处理的Buffer对象,但并没有对压缩数据进行解压操作。只有先解压得到明文JSON字符串,才能解析为你需要的用户信息对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:01