Looker 擴充功能架構可讓您建構自訂 JavaScript 和 TypeScript 應用程式,以及在 Looker 中執行的圖表。擴充功能會在沙箱化 iframe 中執行,並透過擴充功能 SDK 與 Looker 執行個體互動。如果自訂擴充功能發生問題,例如 iframe 內出現空白頁面或錯誤訊息、瀏覽器控制台 JavaScript 或跨源資源共享 (CORS) 錯誤、Looker API 要求失敗 (4xx 或 5xx 狀態碼),或 manifest.lkml 設定錯誤,本文可協助您排解及解決問題。
事前準備和一般設定需求
開始疑難排解前,請確認環境、LookML 專案和使用者帳戶符合執行 Looker 擴充功能的需求:
- 啟用擴充功能架構:Looker 管理員必須依序前往「管理」>「平台」>「擴充功能架構」,啟用「擴充功能架構」設定。
- LookML 專案和模型設定:每個擴充功能都需要 LookML 專案,其中包含下列元件:
- 模型檔案:已設定有效的
connection參數。 - 專案資訊清單檔案 (
manifest.lkml),其中包含application宣告。 - 已設定 Git 連線。
- 模型檔案:已設定有效的
- 資訊清單授權:
manifest.lkml檔案中的application宣告必須明確定義擴充功能所需的所有entitlements,例如 Looker API 呼叫的core_api_methods,或外部網域要求的external_api_urls。擴充功能必須有entitlements區塊才能執行。 - 使用者授權:使用者必須具備擴充功能權限 (例如
access_data、explore或develop),才能存取包含擴充功能 LookML 模型的模型集。開發人員必須具備 LookMLdevelop權限,才能建構擴充功能。 - 診斷工具和環境詳細資料:開始疑難排解前,請備妥下列詳細資料和工具:
- Looker 執行個體網址、LookML 專案名稱,以及在
manifest.lkml中宣告的application名稱。 - 在用戶端機器上存取網路瀏覽器的開發人員工具 (「Console」和「Network」分頁)。
- 在本機開發期間,存取執行本機開發伺服器的終端機。
- Looker API 呼叫發生
5xx伺服器錯誤時,存取 Looker 執行個體記錄 (客戶託管執行個體的looker.log,或 Looker (Google Cloud Core) 執行個體的 Google Cloud 控制台 Cloud Logging 記錄檔探索工具)。
- Looker 執行個體網址、LookML 專案名稱,以及在
偵錯樹狀結構
請使用下列決策樹,開始排解 Looker 擴充功能架構問題:
以下各節將進一步說明樹狀圖中的情境。
檢查瀏覽器控制台和網路記錄
Looker 擴充功能會在瀏覽器的用戶端執行,因此請先檢查瀏覽器的開發人員工具,找出 JavaScript 錯誤、違反安全性政策和失敗的 HTTP 要求,開始排解問題。
檢查瀏覽器控制台是否有錯誤
如要找出導致擴充功能無法載入或執行的用戶端錯誤,請按照下列步驟操作:
- 在 Looker 中,開啟載入擴充功能的頁面。
- 在頁面任一處按一下滑鼠右鍵,然後選取「檢查」 (或在 Windows 和 Linux 上按下 Control+Shift+I 鍵,或在 macOS 上按下 Command+Option+I 鍵)。
- 在開發人員工具面板中,選取「Console」分頁標籤。
- 重新整理頁面,擷取初始載入期間發生的錯誤。
- 檢查控制台中的紅色錯誤訊息:
- JavaScript 執行階段錯誤 (例如
Uncaught TypeError或ReferenceError):請記下堆疊追蹤中的檔案和行號,並參閱「排解執行階段 JavaScript 和邏輯錯誤」。 401 Unauthorized或403 Forbidden錯誤:表示驗證或權限問題。請參閱「排解驗證和 API 存取問題」。404 Not Found錯誤:表示找不到擴充功能的 JavaScript 套件或要求的資源。請驗證資訊清單設定和本機開發伺服器。- CORS 或內容安全政策 (CSP) 錯誤:表示瀏覽器封鎖了跨源要求或資源。請參閱「排解網路、CORS 和安全性政策問題」。
- JavaScript 執行階段錯誤 (例如
在「Network」分頁中檢查失敗的要求
如要分析擴充功能對 JavaScript 組合、資產或 API 端點發出的 HTTP 要求,請按照下列步驟操作:
- 在瀏覽器開發人員工具面板中,選取「Network」分頁標籤。
- 勾選「Disable cache」核取方塊,讓瀏覽器不會載入過時的快取資源。
- 重新整理載入擴充功能的頁面。
- 檢查網路要求清單,找出任何
4xx或5xx狀態碼,然後選取失敗的要求,檢查其「標頭」、「酬載」和「回應」分頁:404擴充功能套件 (例如bundle.js):確認開發伺服器正在執行,且manifest.lkml中的url或file參數正確無誤。- Looker API 要求傳回
401或403:請檢查驗證、權限和授權。 - API 要求上的
400或422:檢查「Payload」和「Response」分頁,找出格式錯誤的 JSON 或無效的要求參數。 5xx伺服器錯誤:代表 Looker 執行個體發生伺服器端錯誤。請查看客戶託管執行個體上的looker.log,或控制台中的 Logs Explorer,找出時間戳記相符的 Looker (Google Cloud Core) 執行個體項目。
如果「Console」或「Network」分頁中未顯示任何錯誤,或您需要驗證 Looker 載入擴充功能的方式,請前往下一節。
驗證資訊清單和專案設定
專案 manifest.lkml 檔案中的 application 宣告會控制 Looker 載入擴充功能的方式,以及擴充功能可使用的資源。manifest.lkml 設定錯誤是載入和 API 失敗的常見原因:
- 驗證
url或file參數:在 Looker IDE 中,開啟專案的manifest.lkml檔案,並檢查application宣告: - 驗證
manifest.lkml授權:查看application宣告中的entitlements區塊。除非明確宣告該權利,否則擴充功能無法使用 Looker 資源或外部網域,如下所示:core_api_methods:必須列出擴充功能呼叫的所有 Looker API 方法 (例如core_api_methods: ["me", "all_looks", "run_inline_query"])。external_api_urls:必須列出擴充功能直接或透過 Proxy 要求的外部非 Looker 網域。- 額外授權:確認擴充功能是否需要
local_storage、navigation、new_window、new_window_external_urls、use_form_submit、use_embeds、use_downloads、use_iframes、use_clipboard、oauth2_urls、global_user_attributes或scoped_user_attributes。
- 驗證、修訂及部署:編輯
manifest.lkml後,點按「Validate LookML」,修訂變更,然後點按「Deploy to Production」,讓更新後的設定生效。
排解本機開發伺服器和環境問題
在本機開發擴充功能時,如果使用 manifest.lkml 中的 url 參數,本機開發伺服器必須處於執行中狀態,且可透過瀏覽器存取:
- 確認開發伺服器正在執行:檢查您啟動開發伺服器的終端機視窗 (例如使用
yarn develop或npm start):- 確認建構作業已編譯完成,且未發生任何錯誤,並顯示監聽訊息 (例如
webpack compiled successfully或listening on localhost:8080)。 - 如果伺服器未執行,請使用
yarn develop或npm start啟動。 - 如果伺服器因語法錯誤或缺少依附元件錯誤而結束,請解決程式碼錯誤,或執行
yarn install(或npm install) 安裝缺少的套件。 - 如果伺服器因通訊埠衝突 (
EADDRINUSE) 而失敗,請停止使用該通訊埠的其他程序,或設定開發伺服器和manifest.lkmlurl參數,改用其他通訊埠。
- 確認建構作業已編譯完成,且未發生任何錯誤,並顯示監聽訊息 (例如
- 直接在瀏覽器中開啟擴充功能網址:複製
manifest.lkml中的url值 (例如https://localhost:8080/bundle.js),然後在新的瀏覽器分頁中開啟:- 不受信任的自行簽署 SSL 憑證:本機開發伺服器經常使用自行簽署的 SSL 憑證。如果瀏覽器顯示憑證安全性警告,請選取「Advanced」(進階),然後前往
localhost,信任瀏覽器工作階段的憑證。在憑證獲得信任之前,瀏覽器會禁止在 Lookeriframe中載入套件。 - 連線遭拒或封鎖:如果瀏覽器無法連上網址,請確認沒有本機防火牆或端點安全防護軟體封鎖連至
localhost設定通訊埠的連線。
- 不受信任的自行簽署 SSL 憑證:本機開發伺服器經常使用自行簽署的 SSL 憑證。如果瀏覽器顯示憑證安全性警告,請選取「Advanced」(進階),然後前往
排解網路、CORS 和安全性政策問題
網路瀏覽器會強制執行同源政策,除非設定跨源資源共享 (CORS) 標頭和安全性政策,否則 Looker 無法載入擴充功能資源,或呼叫不同來源的外部伺服器:
- 在瀏覽器控制台中找出 CORS 錯誤:在「控制台」分頁中,尋找含有
Cross-Origin Resource Sharing、CORS、has been blocked by CORS policy或缺少Access-Control-Allow-Origin標頭的錯誤訊息。 - 設定本機開發伺服器 CORS 標頭:如果您使用
webpack-dev-server(或類似的套件組合工具),請確認webpack.config.js中的devServer設定包含Access-Control-Allow-Origin標頭:javascript devServer: { headers: { "Access-Control-Allow-Origin": "*" } } - 設定正式版託管和外部 API CORS 標頭:如果擴充功能會從外部服務 (例如 Cloud Storage、Amazon S3 或自訂後端伺服器) 載入資產或要求資料,請設定託管服務傳回
Access-Control-Allow-Origin標頭,允許 Looker 執行個體網域。此外,請確認沒有任何網路 Proxy 或防火牆從回應中移除 CORS 標頭,並確保外部網域列在manifest.lkml的external_api_urls中。 - 檢查內容安全政策 (CSP) 和強化擴充功能載入:如果 在載入擴充功能時遇到 CSP 違規,請依序前往 「管理」>「平台」>「擴充功能架構」,查看「強化擴充功能載入」 設定。
排解驗證和 API 存取問題
擴充功能會透過擴充功能 SDK,代表登入的使用者與 Looker API 互動。如果 API 呼叫失敗,且「Network」分頁中顯示 401 Unauthorized 或 403 Forbidden 狀態碼,請檢查下列項目:
- 區分
401和403錯誤:401 Unauthorized:要求未經驗證。如果擴充功能 SDK 未正確初始化,或擴充功能在 SDK 完成驗證交握前嘗試呼叫 API,通常就會發生這個錯誤。403 Forbidden:要求已通過驗證,但登入的使用者缺少必要的 Looker 權限,或擴充功能的manifest.lkml未在core_api_methods中包含呼叫的方法。
- 驗證使用者角色和權限:在「管理」>「使用者」和「管理」>「角色」中,檢查登入使用者的指派角色、權限集和模型集:
- 確認使用者具備擴充功能使用權限,包括
access_data(以及視需要具備explore或develop),適用於包含擴充功能 LookML 模型和擴充功能查詢模型的模型集。 - 確認使用者的角色包含擴充功能呼叫的各個 Looker API 端點所需的特定權限。
- 確認使用者具備擴充功能使用權限,包括
- 呼叫 API 前,請確認 SDK 情境已準備就緒:確認擴充功能程式碼會等待擴充功能 SDK 情境初始化,再叫用 API 方法。
排解擴充功能 SDK 和依附元件問題
如果 npm 或 Yarn 套件安裝發生問題,或缺少 SDK 供應商元件,擴充功能可能無法編譯或連結至 Looker:
- 驗證 Node.js 模組安裝:在終端機中,前往擴充功能專案的根目錄,並檢查
node_modules目錄:- 如果缺少
node_modules或依附元件似乎損毀,請刪除node_modules目錄和鎖定檔案 (yarn.lock或package-lock.json)。 - 選用:如果套件安裝作業一再失敗,請清除套件管理工具快取 (例如執行
npm cache clean --force)。 - 確認安裝的 Node.js 版本符合專案需求,然後執行
yarn install或npm install執行全新安裝。
- 如果缺少
- 檢查
ExtensionProvider初始化:開啟擴充功能的主要進入點檔案 (例如App.js或index.js),確認<ExtensionProvider>(從@looker/extension-sdk-react匯入) 包裝了需要 Looker SDK 內容的應用程式元件:javascript ReactDOM.render( <ExtensionProvider> <App /> </ExtensionProvider>, document.getElementById('root') );如果缺少<ExtensionProvider>,或您將其放在呼叫 SDK 的元件之後,子元件就無法存取 SDK 內容。
排解執行階段 JavaScript 和邏輯錯誤
如果擴充功能的設定、開發伺服器、權限和 SDK 設定都有效,問題可能是擴充功能的自訂 JavaScript 或 TypeScript 程式碼發生執行階段錯誤:
- 分析控制台堆疊追蹤:在瀏覽器的「Console」分頁中,找出紅色錯誤訊息,然後按一下展開箭頭,查看完整的堆疊追蹤。堆疊追蹤記錄的頂端行會指出發生錯誤的原始碼檔案和行號。按一下檔案連結 (例如
MyComponent.js:42),即可直接跳到「Sources」分頁中的該行。 - 檢查未定義或空值:如果發生
TypeError: Cannot read properties of undefined等錯誤,請確認非同步 API 回應或屬性已完成載入,再讓程式碼讀取巢狀屬性。新增防禦性檢查 (例如if (myObject && myObject.property)或選用鏈結myObject?.property)。 - 驗證 API 回應格式:確認程式碼會處理 Looker API 呼叫傳回的實際資料結構 (例如,在呼叫陣列方法前,先驗證回應酬載是物件還是陣列)。
- 使用中斷點和記錄功能偵錯:在瀏覽器的「來源」分頁中,在失敗行之前設定中斷點,暫停執行並即時檢查變數值,或新增
console.log()陳述式來追蹤執行流程。
確認 Looker 版本相容性
Looker 的重大功能更新或變更,可能需要相容版本的 Looker Extension SDK:
- 在擴充功能專案的
package.json檔案中,檢查@looker/extension-sdk(和@looker/extension-sdk-react,如有使用) 的版本。 - 在 Looker 網頁介面中,依序前往「Help」>「About」或「Admin」>「General」>「Settings」,查看執行個體目前的發布版本。
- 請比較您的 Looker 發布版本與
@looker/extension-sdk說明文件中的相容性附註。 - 如果 Looker 執行個體最近升級,且擴充功能使用過時的 SDK,或擴充功能使用較新 SDK 功能,但舊版 Looker 不支援,請將 SDK 套件更新至相容版本:
bash npm install @looker/extension-sdk@latest更新套件後,請重新安裝依附元件,並重新啟動開發伺服器。
收集診斷資訊
如果按照疑難排解步驟操作後仍無法解決問題,請先收集下列資訊,再與支援團隊聯絡:
- Looker 執行個體和專案資訊:
- Looker 執行個體網址 (例如
instance_name.looker.com)。 - Looker 發布版本。
- LookML 專案的名稱,其中包含擴充功能和
manifest.lkml中的application名稱。
- Looker 執行個體網址 (例如
- 擴充功能設定和 SDK 詳細資料:
manifest.lkml檔案中application宣告的副本或螢幕截圖。package.json中指定的@looker/extension-sdk版本。- 擴充功能是在本機開發伺服器 (
url) 執行,還是已部署至正式環境 (file)。
- 錯誤記錄和螢幕截圖:
- 瀏覽器「控制台」和「網路」分頁中的錯誤螢幕截圖或全文 (包括失敗
4xx或5xx要求的「要求標頭」和回應酬載)。 - 如果 API 呼叫持續傳回
5xx伺服器錯誤,請提供looker.log(適用於客戶託管執行個體) 或 Logging 的 Logs Explorer (適用於 Looker (Google Cloud Core) 執行個體) 的相符記錄摘錄。
- 瀏覽器「控制台」和「網路」分頁中的錯誤螢幕截圖或全文 (包括失敗
- 疑難排解摘要和重現步驟:
- 您已執行的疑難排解步驟摘要和結果。
- 重現問題的確切步驟,或最小可重現範例 (如果您懷疑 Looker 擴充功能架構或擴充功能 SDK 有問題)。
聯絡支援團隊
如果已驗證上述所有步驟,但問題仍未解決,請按照下列指示操作: