调试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
相关产品推荐
相关产品推荐

