Official Docker image 2.43.3 ships @napi-rs/canvas without any native binding → “DOMMatrix is not defined” in all PDF nodes

在官方 Docker 镜像中运行 PDF 解析节点(Extract from File 的 pdf 操作,或 Default Data Loader 的 pdfLoader)时出现 DOMMatrix is not defined 。尽管日志同时提示 @napi-rs/canvas 原生绑定加载失败

快速结论:在官方 Docker 镜像中运行 PDF 解析节点(Extract from File 的 pdf 操作,或 Default Data Loader 的 pdfLoader)时出现 DOMMatrix is not defined。尽管日志同时提示 @napi-rs/canvas 原生绑定加载失败,但 Issue 后续已澄清该缺失绑定并非本错误的直接原因,应优先排查长时间运行进程的运行时状态。

适用环境:n8n 2.43.3 / 2.44.3(self-hosted,N8N_RELEASE_TYPE=stable);镜像 docker.n8nio/n8n(Alpine 3.24 基础,Node.js v26.x,x86_64);Docker 部署,外部 task runners(N8N_RUNNERS_MODE=external)。数据库与二进制数据模式与问题无关。

最快修复方案:暂无确认的一步修复方案。Issue 最终状态为无法稳定复现:同一批 PDF 在未修改的 2.43.3 与 2.44.3 上重新解析成功,作者已表示可关闭。可优先尝试重启 n8n 进程后重试同一节点。

注意事项:Issue 中曾建议回退到 2.43.2,但版本矩阵显示 2.43.2 / 2.43.3 / 2.44.3 均存在绑定加载失败,回退不能解决问题。将 @napi-rs/canvas-linux-x64-musl 打入镜像可消除绑定警告并使 DOMMatrix 可用,但作者验证后认为这不是错误的根因,属于非必要改动。

问题场景

用户在官方 Docker 镜像 docker.n8nio/n8nio/n8n:2.43.3 上运行含 PDF 解析的工作流:

  • n8n-nodes-base.extractFromFile,operation 为 pdf;
  • @n8n/n8n-nodes-langchain.documentDefaultDataLoader,dataType 为 binary,loader 为 pdfLoader。

通过 HTTP Request 节点下载 PDF 正常,失败只发生在解析环节。问题在无挂载、无自定义环境变量的纯净镜像中也可触发。

报错原文

Warning: Cannot load "@napi-rs/canvas" package: "Error: Failed to load native binding".
Warning: Cannot polyfill `DOMMatrix`, rendering may be broken.
Warning: Cannot polyfill `ImageData`, rendering may be broken.
Warning: Cannot polyfill `Path2D`, rendering may be broken.
ReferenceError: DOMMatrix is not defined

手动加载包时的原始输出:

Error: Failed to load native binding
  [cause]: [
    Error: Cannot find module './skia.linux-x64-musl.node'
    Error: Cannot find module '@napi-rs/canvas-linux-x64-musl'
  ]

镜像内只存在 wrapper 包:

@napi-rs+canvas@0.1.80

原因分析

  • 现象层面(已确认):镜像中只有 @napi-rs/canvas@0.1.80 这个 JS wrapper,缺少对应平台的本地绑定(该 Alpine/musl x86_64 镜像需要 @napi-rs/canvas-linux-x64-musl,arm64 镜像需要 @napi-rs/canvas-linux-arm64-musl)。因此 pdfjs-dist 无法 polyfill DOMMatrix、ImageData、Path2D,并打印上述警告。
  • 根因层面(Issue 后续修正):作者复核后确认,未修改的 2.43.3 与 2.44.3 对同一批此前失败的 PDF 能正常解析;同时 @napi-rs/canvas 加载失败警告依然存在。即“缺少原生绑定”不是 DOMMatrix is not defined 的直接原因。可能的真正触发因素与长时间运行进程的运行时状态有关,但 Issue 中没有给出确认结论,也无稳定复现路径。
  • 关于构建阶段为何遗漏平台包(如 --no-optional、生产裁剪或 pnpm 未解析目标平台可选依赖),Issue 中只是猜测,未经维护者确认。

环境排查

  • 确认实际使用的镜像 tag 与 digest,并比对是否处于受影响版本区间(2.43.2 / 2.43.3 / 2.44.3 均报告过绑定加载失败)。
  • 确认是否使用外部 task runners(N8N_RUNNERS_MODE=external)以及 n8nio/runners 的版本。
  • 确认进程已连续运行多久,尝试在重启后复现同一工作流。
  • 确认触发节点类型与版本(Extract from File、Default Data Loader / pdfLoader)。
  • 检查容器日志中是否同时出现 Cannot load "@napi-rs/canvas" 与 ReferenceError: DOMMatrix is not defined,两者需分别看待。

解决步骤

  1. 先重启 n8n 进程(或重新部署容器),然后重跑同一工作流的 PDF 节点,确认是否仍报错。Issue 最终结论指向运行时状态而非镜像内容,重启是最小代价的验证动作。
  2. 若问题持续,记录节点类型、PDF 来源与失败时间,尝试更换另一个 PDF 文件复现,以判断是否与特定输入相关。Issue 未验证此点,仅作为隔离变量的手段。
  3. 可优先尝试:若确认需要补齐原生绑定,构建自定义镜像,在同一 base 镜像上安装与 wrapper 版本一致的平台包(如 @napi-rs/canvas-linux-x64-musl@0.1.80,arm64 主机用 @napi-rs/canvas-linux-arm64-musl,Debian/glibc 基础镜像用 -gnu 变体)。目录路径需以镜像内实际 .pnpm 路径为准,版本必须与 wrapper 一致。注意:作者已验证该改动能消除警告,但并未解决问题根因,不视为修复方案。
  4. 不要采用“回退到 2.43.2”的方案,版本矩阵已证明该版本同样缺失绑定。
  5. 在 CI 中增加镜像冒烟检查:在镜像内用 node -e "require(...)" 加载 canvas 包,退出码非 0 则阻断发布。这只能防止绑定缺失类回归,不能覆盖本次 DOMMatrix 报错。
  6. 若需临时绕过,可在 n8n 之外(如 Python + pypdf)完成 PDF 文本提取,再把结果传入工作流。

验证方法

重启或重新部署后,分别执行一次 Extract from File(operation: pdf)和 Default Data Loader(pdfLoader),确认节点输出包含解析后的文本且不再出现 ReferenceError: DOMMatrix is not defined。注意:日志中仍可能出现 Cannot load "@napi-rs/canvas" 警告,这不代表问题未解决;判断标准应放在节点是否成功产出解析结果上。

参考来源

n8n-io/n8n #41242

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30551

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注