使用highcharts-export-server 3.0.0-beta.1时startExport非函数的问题求助
问题
在Express Node.js服务器中使用highcharts-export-server 3.0.0-beta.1版本(替代已停止维护的PhantomJS)时,调用startExport方法触发错误:TypeError: exporter.startExport is not a function。
package.json配置
{ "name": "expresspdftest", "version": "0.1.0", "private": true, "scripts": { "preinstall": "export <setting>=<value>", "start": "node ./bin/www" }, "dependencies": { "base64-img": "^1.0.4", "body-parser": "^1.20.2", "cookie-parser": "~1.4.3", "debug": "~2.6.9", "express": "^4.18.2", "fs": "0.0.1-security", "highcharts": "^7.1.1", "highcharts-export-server": "^3.0.0-beta.1", "http": "0.0.0", "http-errors": "~1.6.2", "jade": "~1.11.0", "morgan": "~1.9.0", "node-fetch": "^2.6.1", "path": "^0.12.7", "pdfmake": "^0.1.54", "request": "^2.88.0", "typescript": "^3.4.5", "winston": "^3.2.1", "winston-daily-rotate-file": "^3.9.0" } }
调用代码片段
const exporter = import('highcharts-export-server'); async function Highcharts() { console.log(exporter); console.log(typeof exporter); await exporter.initPool(); exporter.startExport(graphic, function(err,exp) { // ...后续逻辑 }); }
解决方案
1. 修复模块导入错误
import('highcharts-export-server')是动态导入,返回的是Promise对象,不是直接的模块实例,导致无法直接调用initPool和startExport。有两种修复方式:
方式一:用await处理动态导入
async function Highcharts() { // 等待动态导入完成,获取实际模块 const exporter = await import('highcharts-export-server'); await exporter.initPool(); exporter.startExport(graphic, function(err, exp) { // ...后续逻辑 }); }
方式二:改用CommonJS require语法
如果项目未使用ES模块,直接用require更稳妥:
const exporter = require('highcharts-export-server'); async function Highcharts() { await exporter.initPool(); exporter.startExport(graphic, function(err, exp) { // ...后续逻辑 }); }
2. 适配3.x版本API
highcharts-export-server 3.x基于Puppeteer重构,API和旧版(PhantomJS时代)存在差异:
- 确认
startExport是否已被重命名:3.x版本中可能需要使用export或render方法(可查看模块源码导出确认) - 3.x更推荐Promise风格调用,可替换回调为
async/await:try { const result = await exporter.startExport(graphic); // 处理导出结果 } catch (err) { // 处理错误 }
3. 版本选择建议
如果需要完全兼容旧版代码,可临时降级到highcharts-export-server 2.x版本(最后一个基于PhantomJS的稳定版);长期来看建议迁移到3.x的新API,避免依赖已停止维护的PhantomJS。
内容的提问来源于stack exchange,提问作者Sebastiano Parisi
相关产品推荐
相关产品推荐

