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

NestJS依赖库中使用Puppeteer生成PDF报错求助

NestJS PDF依赖库调用Puppeteer时Chromium版本不匹配报错问题

我正在开发一个面向NestJS的PDF生成依赖库,核心功能基于Puppeteer实现。但在依赖库中调用Puppeteer时会触发以下报错:

Error: Run `npm install` to download the correct Chromium revision (1056772).

直接在主项目中使用Puppeteer完全正常,仅当把PDF生成代码迁移到依赖库的服务中后才出现该问题。

已尝试的无效操作

  • 执行Chromium安装命令:
    node node_modules/puppeteer/install.js
    
    命令返回结果:

    Chromium is already in C:\Users\Greg.cache\puppeteer\chrome\win64-1069273; skipping download.

  • 删除node_modules并重新安装所有依赖,问题未解决。

依赖库package.json

{
  "name": "@gboutte/nestjs-pdf",
  "version": "0.0.3",
  "description": "This package provide a service to render PDF from html string or from handlebars tempaltes for nestjs.",
  "keywords": [
    "nestjs",
    "handlebars",
    "hbs",
    "templates",
    "pdf"
  ],
  "homepage": "https://github.com/gboutte/nestjs-pdf#readme",
  "bugs": {
    "url": "https://github.com/gboutte/nestjs-pdf/issues",
    "email": "gboutte@protonmail.com"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/gboutte/nestjs-pdf"
  },
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "rimraf dist && tsc",
    "prepublish": "npm run build"
  },
  "author": "Grégory Boutte <gboutte@protonmail.com>",
  "license": "MIT",
  "dependencies": {},
  "devDependencies": {
    "@nestjs/common": "^9.1.6",
    "@gboutte/nestjs-hbs": "^0.0.3",
    "@types/node": "^18.11.5",
    "puppeteer": "^19.1.2",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.5.7",
    "typescript": "^4.8.4"
  },
  "peerDependencies": {
    "@nestjs/common": "^9.1.6",
    "@gboutte/nestjs-hbs": "^0.0.3",
    "@types/node": "^18.11.5",
    "puppeteer": "^19.1.2",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.5.7",
    "typescript": "^4.8.4"
  }
}

主项目package.json

{
  "name": "nestjs-hbs-demo",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "main": "dist/index.js",
  "readmeFilename": "README.md",
  "files": [
    "dist/**/*",
    "*.md"
  ],
  "license": "UNLICENSED",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@gboutte/nestjs-hbs": "file:../nestjs-hbs",
    "@gboutte/nestjs-pdf": "file:../nestjs-pdf",
    "@nestjs/common": "^9.0.0",
    "@nestjs/core": "^9.0.0",
    "@nestjs/platform-express": "^9.0.0",
    "@nestjs/platform-fastify": "^9.1.6",
    "puppeteer": "^19.4.1",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.2.0"
  },
  "devDependencies": {
    "@nestjs/cli": "^9.0.0",
    "@nestjs/schematics": "^9.0.0",
    "@nestjs/testing": "^9.0.0",
    "@types/express": "^4.17.13",
    "@types/jest": "28.1.8",
    "@types/node": "^16.0.0",
    "@types/supertest": "^2.0.11",
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "eslint": "^8.0.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "jest": "28.1.3",
    "prettier": "^2.3.2",
    "source-map-support": "^0.5.20",
    "supertest": "^6.1.3",
    "ts-jest": "28.0.8",
    "ts-loader": "^9.2.3",
    "ts-node": "^10.0.0",
    "tsconfig-paths": "4.1.0",
    "typescript": "^4.7.4"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

问题原因

报错中提到的Chromium版本(1056772)是依赖库devDependencies中puppeteer@19.1.2对应的版本,而主项目安装的是puppeteer@19.4.1,对应的Chromium版本为1069273。当依赖库调用Puppeteer时,会尝试加载自身指定版本的Chromium,但主项目中仅存在高版本的Chromium,导致版本不匹配报错。

解决方法

方案1:统一Puppeteer版本

  1. 修改依赖库的package.json,将devDependencies和peerDependencies中的puppeteer版本调整为主项目使用的^19.4.1,保持版本一致。
  2. 执行npm run build重新构建依赖库。
  3. 在主项目中重新安装依赖:npm install。

方案2:手动指定Chromium路径

在依赖库初始化Puppeteer时,直接指定已安装的Chromium路径,跳过版本自动查找:

import puppeteer from 'puppeteer';

async function generatePdf() {
  // 动态获取主项目中Puppeteer的Chromium路径
  const executablePath = puppeteer.executablePath();
  const browser = await puppeteer.launch({ executablePath });
  
  // 后续PDF生成逻辑
  const page = await browser.newPage();
  // ...
  await browser.close();
}

该方式会自动使用主项目中安装的Chromium版本,避免版本冲突。

方案3:调整依赖库的依赖配置

将Puppeteer从依赖库的devDependencies移至dependencies中,确保依赖库安装时会自动下载对应版本的Chromium。不过此方式会增加依赖库的体积,需根据需求权衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:05:19