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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:25:59