Highcharts Export Server Docker部署无法导出静态图片求助
问题描述
环境信息
- 操作系统:Windows 11 Enterprise
- NodeJS版本:14.0.0
- NPM版本:6.14.4
- Highcharts Export Server版本:2.1.0
问题场景
本地手动运行index.js可成功导出Highcharts图片,但通过Docker镜像运行时出现语法错误。
Dockerfile内容
# Getting image from node FROM node:carbon ENV ACCEPT_HIGHCHARTS_LICENSE="1" ENV HIGHCHARTS_USE_STYLED="1" ENV HIGHCHARTS_USE_MAPS="1" ENV HIGHCHARTS_USE_GANTT="1" RUN npm install highcharts-export-server -g --unsafe-perm RUN npm config set strict-ssl=false RUN node /usr/local/lib/node_modules/highcharts-export-server/build.js WORKDIR /usr/src/app COPY package*.json ./ RUN npm install # Bundle app source COPY . . #CMD ls EXPOSE 3001 CMD [ "node", "index.js" ] #ENTRYPOINT ["highcharts-export-server", "--enableServer", "1"]
导出API代码(index.js)
const chartExporter = require("highcharts-export-server"); chartExporter.initPool(); let imageB64 = ''; chartExporter.export(chartDetails, (err, res) => { imageB64 = res.data; response.send(imageB64); chartExporter.killPool(); });
图表配置JSON(chartDetails)
const chartDetails = { type: "jpeg", options: { chart: { type: "pie" }, title: { text: "Heading of Chart" }, plotOptions: { pie: { dataLabels: { enabled: true, format: "<b>{point.name}</b>: {point.y}" } } }, series: [ { data: [ { name: "a", y: 20 }, { name: "b", y: 20 }, { name: "c", y: 50 }, { name: "d", y: 10 } ] } ], exporting: { sourceWidth: 200, sourceHeight: 200 } } };
报错信息
Error : phantom worker 5/6/7/8/9 unexpected data - SyntaxError: Expected token ')' phantomjs://code/worker.js:658 in loop
解决方案
1. 对齐NodeJS版本
你本地用的是NodeJS 14.0.0,但Docker基础镜像node:carbon对应NodeJS 8.x版本,版本差异导致Highcharts Export Server运行时出现语法兼容问题。把Dockerfile开头的基础镜像换成和本地一致的版本:
FROM node:14.0.0
2. 调整安装命令顺序
将npm config set strict-ssl=false移到npm install之前,避免安装过程中出现SSL校验问题:
RUN npm config set strict-ssl=false RUN npm install highcharts-export-server -g --unsafe-perm RUN node /usr/local/lib/node_modules/highcharts-export-server/build.js
3. 修复index.js变量问题
你的代码里直接使用了chartDetails和response变量,但未正确定义或引入:
- 确保
chartDetails被定义在index.js中或通过模块引入 response是HTTP请求的响应对象,需在路由回调中获取(以Express为例)
修正后的index.js示例:
const express = require('express'); const app = express(); const chartExporter = require("highcharts-export-server"); // 定义图表配置 const chartDetails = { type: "jpeg", options: { chart: { type: "pie" }, title: { text: "Heading of Chart" }, plotOptions: { pie: { dataLabels: { enabled: true, format: "<b>{point.name}</b>: {point.y}" } } }, series: [{ data: [ { name: "a", y: 20 }, { name: "b", y: 20 }, { name: "c", y: 50 }, { name: "d", y: 10 } ] }], exporting: { sourceWidth: 200, sourceHeight: 200 } } }; chartExporter.initPool(); // 导出接口 app.get('/export-chart', (req, response) => { chartExporter.export(chartDetails, (err, res) => { if (err) { return response.status(500).send(err.message); } response.send(res.data); chartExporter.killPool(); }); }); app.listen(3001, () => { console.log('Export server running on port 3001'); });
4. 重新构建运行
删除旧镜像和容器后,重新构建并启动:
docker build -t highcharts-exporter . docker run -p 3001:3001 highcharts-exporter
内容的提问来源于stack exchange,提问作者Jeet Bhatt
相关产品推荐
相关产品推荐

