如何将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
相关产品推荐
相关产品推荐

