使用node-fetch获取Bearer Token遇类型错误:responseBody为unknown
解决node-fetch获取Token时responseBody类型为unknown的问题
问题原因
在TypeScript中,response.json()默认返回unknown类型——这是TypeScript的安全机制,它无法提前确定API返回的JSON结构,因此不允许直接访问unknown类型的属性。
解决方案
方案1:类型断言(快速解决)
直接将解析后的响应体断言为包含access_token的对象类型:
import fetch from 'node-fetch' export class APIToken { async getToken() { const tenant_id = '123'; const formData = new URLSearchParams(); formData.append('grant_type', 'password'); formData.append('scope', 'api://'); formData.append('client_secret', '123'); formData.append('client_id', '456'); formData.append('username', 'user@email.com'); formData.append('password', 'password!!'); // 修复URL中的双斜杠错误 const response = await fetch(`https://login.microsoftonline.com/${tenant_id}/oauth2/token`, { method: 'POST', body: formData }); // 类型断言为包含access_token的对象 const responseBody = await response.json() as { access_token: string }; const accessToken = responseBody.access_token; return accessToken; } }
方案2:定义接口(更规范)
通过接口明确API返回的结构,提升代码可读性和可维护性:
import fetch from 'node-fetch' // 定义Token响应的结构接口 interface TokenResponse { access_token: string; token_type: string; expires_in: number; // 可根据实际返回字段补充其他属性 } export class APIToken { async getToken() { const tenant_id = '123'; const formData = new URLSearchParams(); formData.append('grant_type', 'password'); formData.append('scope', 'api://'); formData.append('client_secret', '123'); formData.append('client_id', '456'); formData.append('username', 'user@email.com'); formData.append('password', 'password!!'); const response = await fetch(`https://login.microsoftonline.com/${tenant_id}/oauth2/token`, { method: 'POST', body: formData }); const responseBody = await response.json() as TokenResponse; const accessToken = responseBody.access_token; return accessToken; } }
方案3:运行时类型检查(更安全)
如果担心API返回结构不符合预期,添加运行时检查避免后续报错:
import fetch from 'node-fetch' export class APIToken { async getToken() { const tenant_id = '123'; const formData = new URLSearchParams(); formData.append('grant_type', 'password'); formData.append('scope', 'api://'); formData.append('client_secret', '123'); formData.append('client_id', '456'); formData.append('username', 'user@email.com'); formData.append('password', 'password!!'); const response = await fetch(`https://login.microsoftonline.com/${tenant_id}/oauth2/token`, { method: 'POST', body: formData }); const responseBody = await response.json(); // 运行时验证响应结构 if (typeof responseBody === 'object' && responseBody !== null && 'access_token' in responseBody) { return responseBody.access_token as string; } // 结构不符合预期时抛出错误 throw new Error('获取Token失败:响应结构无效'); } }
额外注意点
你的代码中URL存在双斜杠问题(//${tenant_id}//),会导致请求地址错误,需修改为单斜杠(/${tenant_id}/),否则可能出现请求失败的情况。
内容的提问来源于stack exchange,提问作者JD2775
相关产品推荐
相关产品推荐

