执行图表生成时出现0x03错误:请检查您在Highchart中的输入数据

问题描述 投票:0回答:1
  1. 我正在使用highchart导出服务器在NodeJ中生成图表
  2. 但是当我生成许多图表时,它会给出错误,例如执行图表生成时出现0x03错误:请检查您的输入数据
  3. 这是我的代码

    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);
            });
        })
    }
    

我一次生成所有图表,所以我该如何解决此问题。

node.js highcharts
1个回答
0
投票

我对您的代码进行了一些修改(并使用了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);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.