需要帮助通过AWS Lambda设置Highcharts导出服务器。

huangapple go评论94阅读模式
英文:

Need help setting up a Highcharts Export Server through an aws lambda

问题

I'm trying to create a lambda that hosts an Highcharts server to be called as a service. I've followed some guides that have attempted this in the past but none seem to work anymore. So I've started working the problem my self.

我正在尝试创建一个Lambda函数,用于托管Highcharts服务器,以便作为服务调用。我按照以前尝试过的一些指南进行操作,但似乎都不再起作用。因此,我开始自己解决这个问题。

I built a docker container to run the lambda through and have attempted to get it to parse json chart but phantomjs keeps throwing an error.

我构建了一个Docker容器来运行Lambda函数,并尝试让它解析JSON图表,但是PhantomJS不断报错。

UPDATE---
I discovered that I needed to force the export server to use a downgraded version of highcharts. The below code has been edited to include this and should work.

更新---
我发现我需要强制导出服务器使用降级版本的Highcharts。下面的代码已被编辑以包括此更改,并应该可以工作。

What I have:
Docker file -

FROM public.ecr.aws/lambda/nodejs:18

COPY exports.js package.json  ${LAMBDA_TASK_ROOT}/

ENV ACCEPT_HIGHCHARTS_LICENSE YES
ENV HIGHCHARTS_VERSION 9.2.2  #added the highcharts version
ENV PHANTOMJS_PLATFORM "linux"  #missed a P here
ENV PHANTOMJS_ARCH "x64"
RUN yum install -y tar bzip2
RUN yum install -y vim-minimal

# Install NPM dependencies for function
RUN npm install

CMD [ "exports.handler" ]

package.json-

{
    "name": "highchart_export_server",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "dependencies": {
      "highcharts-export-server": "^2.1.0"
    },
    "devDependencies": {},
    "author": ""
  }

export.js -

const exporter = require('highcharts-export-server');

exports.handler = async (event) => {

    console.log(event);

    const promise = new Promise(function(resolve, reject) {

        // Export settings
        var exportSettings = {
        type: 'png',
        options: event
        };

        // Set up a pool of PhantomJS workers
        exporter.initPool({maxWorkers: 2});

        // Perform an export
        exporter.export(exportSettings, function (err, res) {
            
            // Kill the pool when we're done with it
            exporter.killPool();

            if (res) {
                resolve(res, 200);
            } else {
                reject(err);
            }

        });
    })

    // Return the results of the image
    return promise;

};

After building and running the container, I call it using a basic chart:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d {"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}

I receive this error:
{"errorType":"string","errorMessage":"an error occured when rendering the chart: SyntaxError: Unexpected token S in JSON at position 0","trace":[]}

The JSON chart seems formatted correctly and error seems to be coming from phantompool.js when parsing workers incoming data

如果我让错误打印出它试图解析的内容,我会得到:

SyntaxError: Use of reserved word 'let' in strict mode

phantomjs://code/worker.js:658 in loop

JSON图表似乎格式正确,错误似乎来自于phantompool.js在解析工作程序传入数据时。

英文:

I'm trying to create a lambda that hosts an Highcharts server to be called as a service. I've followed some guides that have attempted this in the past but none seem to work anymore. So I've started working the problem my self.

I built a docker container to run the lambda through and have attempted to get it to parse json chart but phantomjs keeps throwing an error.

UPDATE---
I discovered that I needed to force the export server to use a downgraded version of highcharts. The below code has been edited to include this and should work.

What I have:
Docker file -

FROM public.ecr.aws/lambda/nodejs:18

COPY exports.js package.json  ${LAMBDA_TASK_ROOT}/

ENV ACCEPT_HIGHCHARTS_LICENSE YES
ENV HIGHCHARTS_VERSION 9.2.2  #added the highcharts version
ENV PHANTOMJS_PLATFORM "linux"  #missed a P here
ENV PHANTOMJS_ARCH "x64"
RUN yum install -y tar bzip2
RUN yum install -y vim-minimal

# Install NPM dependencies for function
RUN npm install

CMD [ "exports.handler" ]

package.json-

{
    "name": "highchart_export_server",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "dependencies": {
      "highcharts-export-server": "^2.1.0"
    },
    "devDependencies": {},
    "author": ""
  }

export.js -

const exporter = require('highcharts-export-server');

exports.handler = async (event) => {

    console.log(event);

    const promise = new Promise(function(resolve, reject) {

        // Export settings
        var exportSettings = {
        type: 'png',
        options: event
        };

        // Set up a pool of PhantomJS workers
        exporter.initPool({maxWorkers: 2});

        // Perform an export
        exporter.export(exportSettings, function (err, res) {
            
            // Kill the pool when we're done with it
            exporter.killPool();

            if (res) {
                resolve(res, 200);
            } else {
                reject(err);
            }

        });
    })

    // Return the results of the image
    return promise;

};

After building and running the container, I call it using a basic chart:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d {"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}

I receive this error:
{"errorType":"string","errorMessage":"an error occured when rendering the chart: SyntaxError: Unexpected token S in JSON at position 0","trace":[]}

The JSON chart seems formatted correctly and error seems to be coming from phantompool.js when parsing workers incoming data

If I get the error to print out what it was trying to parse I get:

SyntaxError: Use of reserved word 'let' in strict mode\n\n  phantomjs://code/worker.js:658 in loop\n{\"data\":\"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shYZ8P1XJsYm/YZUKpv2J48JuIfJz6Pam5yzC8h5dQh5VMNlQ8LWlv+16bddmFr8Q8qCd1bhvpPE0U+YHMcPJ4Pmb2HiBp0XFOvpEr+1Ue4iLMuifmmmfsbWA4rpP2LyRddK1XzHtYRV0nJmQ1Jgdxlou7z6IpPH4gzzcpLJPm5mgiNJku5NVictQy8grQX7kC6qG0grmNr9gzxcc5jHkMHIV5BHGEiSpOXAKuThiteQ5vr6SdzjHNezPDuFxOuvGe/ztSRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRpufT/AcVl+viQN4l3AAAAAElFTkSuQmCC

The data itself appears to be a base64 encoded string as expected but phantomjs is prepending an error?

答案1

得分: 0

在审查您的代码时,我注意到您在curl命令中直接将JSON图表数据作为有效载荷传递给Lambda函数,但是您忽略了将JSON数据括在引号内,导致了意外的令牌错误。

为了解决这个问题,请修改您的curl命令,以正确地将JSON数据括在引号内:

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}'

确保将整个JSON有效载荷括在单引号内。

另外,我注意到您的Dockerfile中有一个拼写错误,您设置了环境变量HANTOMJS_PLATFORM而不是PHANTOMJS_PLATFORM。请将该行更正为:

ENV PHANTOMJS_PLATFORM "linux"

在进行这些更改后,重新构建您的Docker容器并测试设置。希望这样可以解决您遇到的JSON解析问题,并使您的Highcharts导出服务器正常运行。

英文:

Upon reviewing your code, I noticed that you are passing the JSON chart data directly as the payload to the Lambda function in the curl command. However, you missed enclosing the JSON data within quotes, resulting in an unexpected token error.

To fix this issue, modify your curl command to properly enclose the JSON data within quotes:

curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"chart":{"type":"bar"},"title":{"text":"Fruit Consumption"},"xAxis":{"categories":["Apples","Bananas","Oranges"]},"yAxis":{"title":{"text":"Fruit eaten"}},"series":[{"name":"Jane","data":[1,0,4]},{"name":"John","data":[5,7,3]}]}'

Make sure to wrap the entire JSON payload within single quotes.

Additionally, I noticed a typo in your Dockerfile where you have set the environment variable HANTOMJS_PLATFORM instead of PHANTOMJS_PLATFORM. Correct that line to:

ENV PHANTOMJS_PLATFORM "linux"

After making these changes, rebuild your Docker container and test the setup again. Hopefully, this should resolve the JSON parsing issue you encountered and allow your Highcharts Export Server to function correctly.

huangapple
  • 本文由 发表于 2023年6月19日 20:39:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/76506714.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定