You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu环境下Node.js部署google-charts-node服务器报错求助

问题解决:await语法错误与Google Charts图片服务器搭建

一、解决当前语法错误

你遇到的SyntaxError是因为在CommonJS模块(用require导入的文件)顶层直接使用了await,而await仅允许在async函数内部或ES模块顶层使用。以下两种修复方式任选其一:

方式1:用async立即执行函数包裹

修改你的file.js如下:

const GoogleChartsNode = require('google-charts-node');
const fs = require('fs');

// 定义图表绘制函数
function drawChart() {
  const data = google.visualization.arrayToDataTable([
    ['City', '2010 Population'],
    ['New York City, NY', 8175000],
    ['Los Angeles, CA', 3792000],
    ['Chicago, IL', 2695000],
    ['Houston, TX', 2099000],
    ['Philadelphia, PA', 1526000],
  ]);

  const options = {
    title: 'Population of Largest U.S. Cities',
    chartArea: { width: '50%' },
    hAxis: {
      title: 'Total Population',
      minValue: 0,
    },
    vAxis: {
      title: 'City',
    },
  };

  const chart = new google.visualization.BarChart(container);
  chart.draw(data, options);
}

// 用async立即执行函数处理异步调用
(async function() {
  try {
    // 生成图表的base64图片数据
    const imageBase64 = await GoogleChartsNode.render(drawChart);
    // 将base64数据写入本地文件
    fs.writeFileSync('chart.png', imageBase64, 'base64');
    console.log('图表已保存为chart.png');
  } catch (error) {
    console.error('生成图表失败:', error);
  }
})();

方式2:用Promise的.then()替代await

如果不习惯async/await,也可以用传统Promise链式调用:

const GoogleChartsNode = require('google-charts-node');
const fs = require('fs');

function drawChart() {
  // 同上,省略重复代码
}

GoogleChartsNode.render(drawChart)
  .then(imageBase64 => {
    fs.writeFileSync('chart.png', imageBase64, 'base64');
    console.log('图表已保存为chart.png');
  })
  .catch(error => {
    console.error('生成图表失败:', error);
  });

执行node file.js后,当前目录会生成chart.png图片。

二、搭建可被curl调用的图表服务器

按照你的需求,用Express搭建HTTP服务器,让其他程序通过curl请求获取图表图片:

  1. 安装Express依赖:
npm install express
  1. 创建server.js文件:
const express = require('express');
const GoogleChartsNode = require('google-charts-node');
const app = express();
const port = 3000;

// 允许接收JSON格式请求体(后续可支持动态传入图表配置)
app.use(express.json());

// 定义图表生成接口
app.get('/generate-chart', async (req, res) => {
  try {
    // 从请求参数动态获取图表标题(可选)
    function drawChart() {
      const chartTitle = req.query.title || 'Population of Largest U.S. Cities';
      
      const data = google.visualization.arrayToDataTable([
        ['City', '2010 Population'],
        ['New York City, NY', 8175000],
        ['Los Angeles, CA', 3792000],
        ['Chicago, IL', 2695000],
        ['Houston, TX', 2099000],
        ['Philadelphia, PA', 1526000],
      ]);

      const options = {
        title: chartTitle,
        chartArea: { width: '50%' },
        hAxis: {
          title: 'Total Population',
          minValue: 0,
        },
        vAxis: {
          title: 'City',
        },
      };

      const chart = new google.visualization.BarChart(container);
      chart.draw(data, options);
    }

    const imageBase64 = await GoogleChartsNode.render(drawChart);
    // 设置响应头为图片类型,返回二进制数据
    res.setHeader('Content-Type', 'image/png');
    res.send(Buffer.from(imageBase64, 'base64'));
  } catch (error) {
    res.status(500).send(`生成图表失败:${error.message}`);
  }
});

// 启动服务器
app.listen(port, () => {
  console.log(`图表服务器已启动,访问地址:http://localhost:${port}/generate-chart`);
});
  1. 启动服务器:
node server.js
  1. 用curl调用接口获取图片:
curl http://localhost:3000/generate-chart > my-chart.png

或者自定义标题:

curl "http://localhost:3000/generate-chart?title=美国城市人口统计" > my-chart.png

内容的提问来源于stack exchange,提问作者Albert C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:35:16