Node.js调用Microsoft Graph API返回乱码,如何获取JSON响应?
解决Node.js中axios调用Microsoft Graph API返回乱码的问题
核心原因:Graph API默认返回gzip压缩的响应内容,Insomnia等工具会自动解压,但Node.js环境下的axios默认未开启自动解压功能,导致你拿到的是原始压缩二进制数据,显示为乱码。
快速修复方案:
在axios请求中添加两个关键配置:- 设置
Accept-Encoding头告知服务端你接受压缩格式 - 开启
decompress: true让axios自动解压响应(axios 0.21.0及以上版本支持)
示例代码:
const axios = require('axios'); async function getUsers(accessToken) { try { const response = await axios.get('https://graph.microsoft.com/v1.0/users', { headers: { 'Authorization': `Bearer ${accessToken}`, 'Accept-Encoding': 'gzip, deflate' // 明确接受压缩格式 }, decompress: true // 开启自动解压 }); console.log(response.data); // 此时应该能正常拿到JSON数据 } catch (error) { console.error(error); } }- 设置
低版本axios兼容方案(低于0.21.0):
手动用Node.js的zlib模块解压响应:const axios = require('axios'); const zlib = require('zlib'); const { promisify } = require('util'); const gunzip = promisify(zlib.gunzip); async function getUsers(accessToken) { try { const response = await axios.get('https://graph.microsoft.com/v1.0/users', { headers: { 'Authorization': `Bearer ${accessToken}`, 'Accept-Encoding': 'gzip' }, responseType: 'arraybuffer' // 以二进制格式获取响应 }); // 判断是否是gzip压缩的响应 if (response.headers['content-encoding'] === 'gzip') { const decompressedData = await gunzip(response.data); const jsonData = JSON.parse(decompressedData.toString('utf8')); console.log(jsonData); } else { console.log(response.data); } } catch (error) { console.error(error); } }额外排查点:检查是否误设置了
responseType为arraybuffer或blob,如果是,改回默认的json(或按上述手动解压方式处理)。
内容的提问来源于stack exchange,提问作者John Rick
相关产品推荐
相关产品推荐

