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

调试OAuth流程代码时遇“The Command Text isn't initialized”错误求助

解决Power BI自定义OAuth连接器“The Command Text isn't initialized”错误

这个错误的核心原因是你的连接器仅实现了OAuth授权流程,但缺少核心的数据导航/获取逻辑——Power BI需要明确知道如何从数据源获取数据,否则会判定“命令文本未初始化”。以下是具体修复方案:

关键修复点

  • 添加核心数据获取函数:定义一个用于实际请求数据的函数(比如B-------.Contents),该函数会利用授权后的令牌调用目标API。
  • 关联数据源Kind与导航函数:在数据源Kind定义中指定NavigationFunction,让Power BI识别数据入口。
  • 修正代码中的小问题:
    • state = - 应为字符串类型,改为state = "random-state-value"(实际使用时可生成随机值)
    • Web.Contents的令牌请求URL末尾多了问号,需删除,避免参数拼接错误
    • 移除授权URL中硬编码的username和password,OAuth授权码流程不需要在此处传递账号密码,应由用户在登录页面输入

修改后的完整代码

// This file contains your Data Connector logic

[Version = "1.0.0"]

section B-------;

[DataSource.Kind="B-------", Publish="B-------.Publish"]
shared B-------.Contents = () =>
    let
        // 示例:调用目标API获取数据,实际需替换为你的API地址和逻辑
        token = Value.GetCurrentCredentials()[AccessToken],
        response = Web.Contents("https://api.*************.com/data", 
            [Headers = [Authorization = "Bearer " & token]]),
        data = Json.Document(response)
    in
        data;

// Login/Auth info
client_id = "your-client-id";
client_secret = "your-client-secret";
redirect_uri = "https://oauth.powerbi.com/views/oauthredirect.html";
state = "random-state-value";

StartLogin = (resourceURL, state, display) =>
    let
        authorizeURL = "https://auth.*************.com/oauth/authorize?" & Uri.BuildQueryString
        ([
            client_id = client_id,
            response_type = "code",
            response_mode = "query",
            redirect_uri = redirect_uri,
            state = state
        ])
    in
        [
            loginUri = authorizeURL,
            callbackUri = redirect_uri
        ];

FinishLogin = (context, callbackUri, state) =>
    let
        parts = Uri.Parts(callbackUri)[Query],
        result = if(Record.HasFields(parts, {"error", "error_description"})) then
                    error Error.Record(parts[error], parts[error_description], parts)
                else
                    TokenMethod(parts[code], "authorization_code")
    in
        result;

TokenMethod = (authCode, grant_type) =>
    let
        codeParameter = if(grant_type = "authorization_code") then [code = authCode]
                        else [refresh_token = authCode],
        query = codeParameter & 
                [
                    client_id = client_id,
                    client_secret = client_secret,
                    grant_type = grant_type,
                    redirect_uri = redirect_uri
                ],
        tokenResponse = Web.Contents("https://auth.*****************.com/oauth/token", 
                [
                    Content = Text.ToBinary(Uri.BuildQueryString(query)),
                    Headers = 
                    [
                        #"Content-type" = "application/x-www-form-urlencoded",
                        #"Accept" = "application/json"
                    ]
                ]),
        parts = Json.Document(tokenResponse)
    in
        if(parts[error]? <> null) then
            error Error.Record(parts[error], parts[message])
        else
            parts;

Refresh = (resourceUrl, refresh_token) => TokenMethod(refresh_token, "refresh_token");

// Data Source Kind description
B------- = () => [
    Authentication = [
        OAuth = 
        [
            StartLogin = StartLogin,
            FinishLogin = FinishLogin,
            Refresh = Refresh
        ]
    ],
    NavigationFunction = B-------.Contents
];

// Data Source UI publishing description
B-------.Publish = [
    Beta = true,
    Category = "Other",
    ButtonText = { Extension.LoadString("ButtonTitle"), Extension.LoadString("ButtonHelp") },
    LearnMoreUrl = "https://powerbi.microsoft.com/",
    SourceImage = B-------.Icons,
    SourceTypeImage = B-------.Icons
];

B-------.Icons = [
    Icon16 = { Extension.Contents("B-------16.png"), Extension.Contents("B-------20.png"), Extension.Contents("B-------24.png"), Extension.Contents("B-------32.png") },
    Icon32 = { Extension.Contents("B-------32.png"), Extension.Contents("B-------40.png"), Extension.Contents("B-------48.png"), Extension.Contents("B-------64.png") }
];

补充说明

B-------.Contents是核心的数据入口函数,你需要根据实际业务需求修改API地址和数据解析逻辑,比如将返回的JSON数据转换为Power BI可识别的表格格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:10:17