phantomjs+echartsconvert踩坑记第二弹
问题出现
首先起因是需要在一台无外网的centos机器上做应用的部署验证,phantomjs启动的时候会报错找不到font字体,安装了默认缺失的字体后,导出echarts图又报错
报错现象
• 执行导出命令(包含多张echarts参数后端生成的图片)
• 现象: 图片均一样且没有文字,且生成的图都为随机一张
解决思路:
• 首先拆解问题:1、图片一样;2、无字体
• 是否前端传输的echart数据有问题:1、检查接口前端传参-按理调试过程中已经核对,此处可以再校验,发现数据不是
• 那么只有一种可能,后端生成问题
• 图片一样:代表调用echarts-convert.js文件时,可能是多线程执行,因为什么原因导致了数据未隔离
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
// 首先在后端连入log,查看导出的耗时和大小,如果均一致说明数据未隔离
.doOnNext(base64 -> log.info("【图表1】日期趋势图生成成功,base64长度: {}", base64 != null ? base64.length() : 0))
// ...后续的生成逻辑均使用log
// 查看发现果然都一样,此时本地联调没问题,拉下服务器的phantomjs和echarts-convert文件,对比本地环境,发现
服务器:
var args = convert.serverGetArgs(request);
if (args.opt !== undefined) {
var check = convert.serverCheckAndSet(params, args);
if (check) {
convert.client(params, write); // 传的是 params(全局共享)
}
}
本机:
var reqParams = convert.serverGetArgs(request);
if (reqParams.opt !== undefined) {
var check = convert.serverCheckAndSet(params, reqParams);
if (check) {
convert.client(reqParams, write); // 传的是 reqParams(每次请求独立)
}
}
对比发现新版本修复了多张echarts图导出的问题已经修复,主要是变量的作用域上。
• 此时去调试问题1图片重复问题已然得到解决,但还是没有任何文字,明确了前端是有传输对应配置的情况下,考虑以下思路:
• 查看是否有中文字体支持
• fc-list :lang=zh
• 如果有,查看phantomjs和echarts-convert是否有冲突,按理说不可能有
• 大概率没有,服务器可能未安装中文字体,将本地的字体库安装,重启服务复测
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
# 打开 C:\Windows\Fonts\,找到以下字体文件并复制出来:
- simhei.ttf (黑体)
- simsun.ttc (宋体)
- msyh.ttf 或 msyh.ttc (微软雅黑)
# 在服务器上安装字体
# 创建字体目录
mkdir -p /usr/share/fonts/chinese
# 复制字体文件到该目录
cp simhei.ttf simsun.ttc msyh.ttc /usr/share/fonts/chinese/
# 设置权限
chmod 644 /usr/share/fonts/chinese/*
# 刷新字体缓存
fc-cache -fv
# 验证字体是否安装成功
fc-list :lang=zh
# 重启服务
# 杀掉 phantomjs 进程
pkill -f phantomjs
# 重启 Java 服务
systemctl restart your-java-service
最终该问题得以解决