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.jsChromium 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版本
- 修改依赖库的
package.json,将devDependencies和peerDependencies中的puppeteer版本调整为主项目使用的^19.4.1,保持版本一致。 - 执行
npm run build重新构建依赖库。 - 在主项目中重新安装依赖:
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
相关产品推荐
相关产品推荐

