從 1.123.6 更新至 1.123.61 → 在代碼節點中使用 prom-client 損壞

描述問題/錯誤/問題

我們最近從 1.123.6 更新到 1.123.61。我們有一個 OTEL 工作流程用於追蹤自訂指標,它使用程式碼節點和內部使用的 prom-client 程式庫,如下所示 const client = require('prom-client');。由於「找不到模組 ‘prom-client’」的錯誤,這不再起作用。我們啟用了 N8N_METRICS 並且也設定了 NODE_FUNCTION_ALLOW_EXTERNAL"prom-client"。這在 1.123.6 中是有效的。這是迴歸還是重大變更?

請分享您的工作流程

分享最後一個節點傳回的輸出

[
{
“name”: “n8n_learning_progress_achievement_sync_total”,
“description”: “Number of learning progress syncs from achievement webhook”,
“values”: {
“academy”: “faps-fernstudium”,
“testStatus”: “passed”,
“assignment”: 17392228439111
},
“error”: “Cannot find module ‘prom-client’ [line 1, for item 0]”
}
]

您的 n8n 設定資訊

  • n8n 版本:1.123.61
  • 資料庫(預設值:SQLite):Postgres
  • n8n EXECUTIONS_PROCESS 設定(預設值:own、main):own、main
  • 透過以下方式執行 n8n(Docker、npm、n8n cloud、桌面應用程式):Docker on render.com
  • **作業系統:

@Florian_Glappa

這似乎是一個迴歸問題。

您可以在 Render 上修改 Start Command 來在啟動 n8n 之前安裝該套件:

npm install prom-client && n8n start

或者,您可以將 Docker 映像版本固定回 1.123.6,直到發佈修復程式。

如果您選擇開啟 GitHub issue,可以將其分類為 Regression

  • 受影響的版本1.123.61
  • 正常工作的版本1.123.6
  • 環境:Docker
  • 問題prom-client 不再被提升到根目錄 node_modules,導致 Code nodes 中的 require('prom-client') 中斷,即使設定了 NODE_FUNCTION_ALLOW_EXTERNAL

Hi @Florian_Glappa

這個問題是 n8n 最近依賴套件整合和套件重構更新的附帶影響,而不是對 Code 節點的有意破壞性變更。

為什麼它停止運作:

之前,prom-client 在 n8n 的根 node_modules 中是一個未整合的頂層依賴。設置 NODE_FUNCTION_ALLOW_EXTERNAL=prom-client 允許 Code 節點解析 n8n 的內部副本。在最近的版本中,n8n 更新了其內部套件結構/打包工具(隔離內部依賴),因此 prom-client 不再直接暴露在根 node_modules 目錄中供 Node 的模組解析器找到。

通過 require() 依賴 n8n 的內部子依賴可能在版本更新時破壞,當內部套件移動位置時。


如何修復它(由於你在 Render.com 上通過 Docker 運行):

永久解決方案是在你的 Docker 容器中明確將 prom-client 安裝為外部模組,以便 Node.js 始終可以解析它。

修復 1:自訂 Dockerfile(推薦)

如果你在 Render 上通過 Dockerfile 部署,請更新你的 Dockerfile 以明確安裝 prom-client:

FROM n8nio/n8n:1.123.61

USER root
# 全域安裝 prom-client 以便 Code 節點可以使用它
RUN npm install -g prom-client
USER node

# 確保 NODE_PATH 包含全域模組
ENV NODE_PATH=/usr/local/lib/node_modules

確保你的環境變數保持設置:

NODE_FUNCTION_ALLOW_EXTERNAL=prom-client

修復 2:Render 啟動命令(替代方案)

如果你在 Render 上直接運行官方 n8nio/n8n 映像而不使用自訂 Dockerfile,你可以在啟動 n8n 之前添加啟動指令碼或命令覆蓋:

cd /home/node/.n8n && npm install prom-client && n8n start

一旦在容器環境中明確安裝了 prom-client,你的 Code 節點的 const client = require(‘prom-client’) 將再次順利運作!

謝謝!

@Florian_Glappa 你能分享你的完整設置,包括你如何安裝 npm 套件嗎?你也在使用任務運行器嗎?因為那會改變事情。

我沒有安裝 npm 套件,如文件所述,n8n 是在內部使用該套件,我只是通過我在文章中提到的兩個環境變數來鉤入該功能。

@Florian_Glappa 只是雙重確認一下,在你更新前是 1.123.6 還是 1.123.60?你有使用外部任務運行器嗎?

可能是最近的一些強化步驟阻止了套件載入。

版本是 1.123.6。我不使用外部任務執行器。

@Florian_Glappa 我做了一些調查,看起来在 1.123.42 版本中停止工作,但在目前最新的測試版本中似乎已經恢復正常,所以如果可能的話,進行 v2 更新可能值得嘗試。

不過,我已經建立了 N8N-10510 作為開發票證,以便看看我們是否能夠解決這個問題。

非常感謝你深入探討這個問題。v2 更新需要進行破壞性變更的研究,這對我們現在來說是不可能的。所以我們期待 N8N-10510 :slight_smile:

值得注意的是,v1 將在年底前達到生命週期結束 (EoL),所以可能值得開始為此進行規劃。

關於這個問題……fix(Code Node): External modules not working even when allowed in n8n version 1.x by RomanDavydchuk · Pull Request #34093 · n8n-io/n8n · GitHub 已經建立,所以應該能在週末前全部解決。

我看到它已經合併並在 1.123.66 版本中發布了,太好了!不過遺憾的是,這個版本只有 amd 和 arm Docker 映像,沒有通用映像。我想我需要等待那個版本?

發布了新版本 n8n@1.123.66,其中包括 GitHub PR 34093

我們長時間以來只有這 2 張圖片,你使用的是哪一張?