您在Highchart中的输入数据"/>
执行图表生成时出现0x03错误:请检查您在Highchart中的输入数据
- 我正在使用highchart导出服务器在NodeJ中生成图表
- 但是当我生成许多图表时,它会给出错误,例如执行图表生成时出现0x03错误:请检查您的输入数据
这是我的代码
exports.generateAllCharts = (chartData, callback) => { highchartsExporter.initPool({ maxWorkers: 100, initialWorkers: 40, workLimit: 100, queueSize: 40, timeoutThreshold: 600000 }); var allPromises = []; if(!chartData ||chartData.length === 0) { return callback({ code: '4', msg: 'Please send chartdata' }) } allPromises.push(exports.getStockChartImg(chartData[1])); allPromises.push(exports.priceChartVsPeersImg(chartData[2])); allPromises.push(exports.getPieChartImg(chartData[3])); allPromises.push(exports.getPieChartImg(chartData[4])); allPromises.push(exports.getPieChartImg(chartData[5])); allPromises.push(exports.getPieChartImg(chartData[6])); allPromises.push(exports.getPieChartImg(chartData[13])); allPromises.push(exports.getPieChartImg(chartData[14])); allPromises.push(exports.getPieChartImg(chartData[15])); allPromises.push(exports.getPieChartImg(chartData[16])); allPromises.push(exports.getPieChartImg(chartData[18])); allPromises.push(exports.getPieChartImg(chartData[19])); allPromises.push(exports.getPieChartImg(chartData[7])); allPromises.push(exports.getPieChartImg(chartData[17])); allPromises.push(exports.getPieChartImg(chartData[20])); allPromises.push(exports.getPieChartImg(chartData[21])); allPromises.push(exports.getPieChartImg(chartData[22])); allPromises.push(exports.getPieChartImg(chartData[23])); allPromises.push(exports.getPieChartImg(chartData[24])); allPromises.push(exports.getPieChartImg(chartData[25])); allPromises.push(exports.getPieChartImg(chartData[26])); allPromises.push(exports.getPieChartImg(chartData[27])); allPromises.push(exports.getPieChartImg(chartData[33])); allPromises.push(exports.getPieChartImg(chartData[34])); allPromises.push(exports.getGlobalOwnershipDistributionChartImg(chartData[35])); allPromises.push(exports.getPieChartImg(chartData[36])); allPromises.push(exports.getPieChartImg(chartData[37])); allPromises.push(exports.getPieChartImg(chartData[38])); allPromises.push(exports.getPieChartImg(chartData[39])); allPromises.push(exports.getPieChartImg(chartData[40])); allPromises.push(exports.getPieChartImg(chartData[41])); allPromises.push(exports.getPieChartImg(chartData[42])); allPromises.push(exports.getPieChartImg(chartData[43])); Promise.all(allPromises) .then(data => { highchartsExporter.killPool(); return callback({ code: '0', custImg: { pc1: data[0].data, pc2: data[1].data, pc3: data[2].data, pc4: data[3].data, pc5: data[4].data, pc6: data[5].data, pc7: data[6].data, pc8: data[7].data, pc9: data[8].data, pc10: data[9].data, pc11: data[10].data, pc12: data[11].data, pc13: data[12].data, pc14: data[13].data, pc17: data[14].data, pc18: data[15].data, pc19: data[16].data, pc20: data[17].data, pc21: data[18].data, pc22: data[19].data, pc23: data[20].data, pc24: data[21].data, pc27: data[22].data, pc28: data[23].data, pc29: data[24].data, pc30: data[25].data, pc31: data[26].data, pc32: data[27].data, pc33: data[28].data, pc34: data[29].data, pc35: data[30].data, pc36: data[31].data, pc37: data[32].data, } }) }) .catch(err => callback({ code: '5', msg: 'Error generating charts', err, })) } exports.getPieChartImg = (seriesData, xOrLength) => { var chartOpts = { colors: ['#7380D4', '#749FD4', '#74BFD4', '#74D4B6', '#99EBA8', '#FEE08B', '#FDAE61', '#F07346', '#E65433', '#C92D22'], chart: { plotBackgroundColor: null, plotBorderWidth: null, plotShadow: false, renderTo: 'container', style: { fontSize: '20px', background: '#fffdcc' }, width:650, }, credits: { enabled: false }, title: { text: null, }, tooltip: { pointFormat: '{series.name}: {point.percentage:.1f}%' }, legend: { itemStyle: { font: 'sans-serif', fontWeight: 'bold', fontSize: '13px' }, useHTML: true, layout: 'vertical', align: 'right', verticalAlign: 'middle', labelFormatter: ()=> { if (this.name[xOrLength] > 9) { var words = this.name.split(/[\s]+/); var numWordsPerLine = 1; var str = []; for (var word in words) { if (parseInt(word) > 0 && parseInt(word) % numWordsPerLine == 0) str.push('<br>'); str.push(words[word]); } var label = str.join(' '); // Make legend text bold and red if most recent value is less than prior if (this.name[1] > this.name[2]) { return '<span style="font-weight:bold">' + label + '</span>'; } else { return label; } } else { return this.name; } } }, plotOptions: { pie: { size: '85%', allowPointSelect: true, cursor: 'pointer', showInLegend: true, dataLabels: { enabled: true, allowOverlap: false, distance: 10, formatter: ()=> { return undefined; // if (parseFloat(this.percentage.toFixed(2)) > 0.35) { // return '' + parseFloat(this.percentage).toFixed(2) + '%'; // } }, padding: 5, style: { fontFamily: '\'Lato\', sans-serif', /*lineHeight: '18px',*/ fontWeight: 'normal', fontSize: '18px' } } }, series: { stacking: 'normal', dataLabels: { enabled: true, color: '#6f6f6f', style: { fontFamily: '\'Lato\', sans-serif', /*lineHeight: '18px',*/ fontWeight: 'normal', fontSize: '18px' }, format:'{point.percentage:.2f}' }, pointWidth: 30, cursor: 'pointer' } }, series: [{ name: "Value", type: 'pie', data: seriesData }], navigation: { buttonOptions: { enabled: false } }, }; var exportSettings = generateExportSettings(chartOpts, 'Stock'); return generateBase64Chart(exportSettings, 3) } function generateExportSettings(chartOpts, constr) { return { // b64: true, instr: JSON.stringify(chartOpts), noDownload: true, constr, globalOptions: { colors: ['#7380D4', '#749FD4', '#74BFD4', '#74D4B6', '#99EBA8', '#FEE08B', '#FDAE61', '#F07346', '#E65433', '#C92D22'], lang: { thousandsSep: ',' } }, scale: 2, styledMode: false, type: "image/png", width: false, }; } function generateBase64Chart(exportSettings, number) { return new Promise((resolve, reject) => { //Perform an export highchartsExporter.export(exportSettings, function (err, res) { //The export result is now in res. //If the output is not PDF or SVG, it will be base64 encoded (res.data). //If the output is a PDF or SVG, it will contain a filename (res.filename). if(err) { Logger.error("IN ERROR: ", number); Logger.error("ERROR: ", err); return reject({ code: '1', err, msg: 'Error in stock chart', exportSettings }) } return resolve({ code: '0', msg: 'success', data: 'data:image/png;base64,' + res.data, }) //Kill the pool when we're done with it, and exit the application // highchartsExporter.killPool(); // process.exit(1); }); }) }
回答如下:我一次生成所有图表,所以我该如何解决此问题。
我对您的代码进行了一些修改(并使用了getPieChartImg,因为它是唯一可用的代码),并尝试导出大量图表(在本例中为35)。我没有遇到0x03错误。这是修改后的代码:
(test.js)
const exporter = require('./promise-based.js');
let numberOfCharts = 35;
let chartsData = [];
for (let i = 0; i < numberOfCharts; i++) {
chartsData.push([1, 2, 3, 4, 5]);
}
exporter.generateAllCharts(chartsData, results => {
if (results.code === '0') {
console.log('All charts exported!');
console.log(results);
} else {
console.log('Error #' + results.code + ': ' + results.msg);
if (results.err) {
console.log(results.err);
}
}
process.exit();
});
((promise-based.js)
const highchartsExporter = require('highcharts-export-server');
let promiseId = 0;
exports.generateAllCharts = (chartData, callback) => {
let allPromises = [];
let chartsLen = chartData.length;
highchartsExporter.logLevel(4);
highchartsExporter.initPool({
maxWorkers: 100,
initialWorkers: 50,
workLimit: 100,
queueSize: 50,
timeoutThreshold: 10000
});
if (!chartData || !chartsLen) {
highchartsExporter.killPool();
return callback({
code: '4',
msg: 'Please send chartdata'
});
}
for (let i = 0; i < chartsLen; i++) {
allPromises.push(
new Promise((resolve, reject) => {
exports.getPieChartImg(chartData[i], false, results => {
if (results.code !== '0') {
return reject(results);
}
return resolve(results);
});
})
);
}
Promise.all(allPromises)
.then(data => {
highchartsExporter.killPool();
let imagesObject = {
code: '0',
custImg: {}
};
data.forEach((image, index) => {
imagesObject.custImg['pc' + (index + 1)] = image.data;
imagesObject.custImg.promiseId = image.promiseId;
});
return callback(imagesObject);
})
.catch(err => callback({
code: '5',
msg: 'Error generating charts',
err
}));
};
exports.getPieChartImg = (seriesData, xOrLength, cb) => {
let chartOpts = {
colors: ['#7380D4', '#749FD4', '#74BFD4', '#74D4B6', '#99EBA8', '#FEE08B', '#FDAE61', '#F07346', '#E65433', '#C92D22'],
chart: {
plotBackgroundColor: null,
plotBorderWidth: null,
plotShadow: false,
renderTo: 'container',
style: {
fontSize: '20px',
background: '#fffdcc'
},
width: 650,
},
credits: {
enabled: false
},
title: {
text: null,
},
tooltip: {
pointFormat: '{series.name}: {point.percentage:.1f}%'
},
legend: {
itemStyle: {
font: 'sans-serif',
fontWeight: 'bold',
fontSize: '13px'
},
useHTML: true,
layout: 'vertical',
align: 'right',
verticalAlign: 'middle',
labelFormatter: () => {
if (this.name[xOrLength] > 9) {
let words = this.name.split(/[\s]+/);
let numWordsPerLine = 1;
let str = [];
for (let word in words) {
if (parseInt(word) > 0 && parseInt(word) % numWordsPerLine == 0)
str.push('<br>');
str.push(words[word]);
}
let label = str.join(' ');
// Make legend text bold and red if most recent value is less than prior
if (this.name[1] > this.name[2]) {
return '<span style="font-weight:bold">' + label + '</span>';
} else {
return label;
}
} else {
return this.name;
}
}
},
plotOptions: {
pie: {
size: '85%',
allowPointSelect: true,
cursor: 'pointer',
showInLegend: true,
dataLabels: {
enabled: true,
allowOverlap: false,
distance: 10,
formatter: () => {
return undefined;
// if (parseFloat(this.percentage.toFixed(2)) > 0.35) {
// return '' + parseFloat(this.percentage).toFixed(2) + '%';
// }
},
padding: 5,
style: {
fontFamily: '\'Lato\', sans-serif',
// lineHeight: '18px',
fontWeight: 'normal',
fontSize: '18px'
}
}
},
series: {
stacking: 'normal',
dataLabels: {
enabled: true,
color: '#6f6f6f',
style: {
fontFamily: '\'Lato\', sans-serif',
// lineHeight: '18px',
fontWeight: 'normal',
fontSize: '18px'
},
format: '{point.percentage:.2f}'
},
pointWidth: 30,
cursor: 'pointer'
}
},
series: [{
name: "Value",
type: 'pie',
data: seriesData
}],
navigation: {
buttonOptions: {
enabled: false
}
},
};
let exportSettings = generateExportSettings(chartOpts, 'Stock');
return generateBase64Chart(exportSettings, 3, cb);
};
function generateExportSettings(chartOpts, constr) {
return {
type: 'png',
constr,
b64: true,
// async: false,
noDownload: true,
scale: 2,
options: chartOpts,
globalOptions: {
colors: ['#7380D4', '#749FD4', '#74BFD4', '#74D4B6', '#99EBA8', '#FEE08B', '#FDAE61', '#F07346', '#E65433', '#C92D22'],
lang: {
thousandsSep: ','
}
}
};
}
function generateBase64Chart(exportSettings, number, cb) {
// Perform an export
highchartsExporter.export(exportSettings, function(err, res) {
// The export result is now in res.
// If the output is not PDF or SVG, it will be base64 encoded (res.data).
// If the output is a PDF or SVG, it will contain a filename (res.filename).
if (err) {
return cb({
code: '1',
msg: 'Error in stock chart',
err,
exportSettings
});
}
promiseId++;
return cb({
code: '0',
msg: 'Success',
promiseId: promiseId,
data: 'data:image/png;base64,' + res.data,
});
// Kill the pool when we're done with it, and exit the application
// highchartsExporter.killPool();
// process.exit(1);
});
}
更多推荐
执行图表生成时出现0x03错误:请检查您在Highchart中的输入数据
发布评论