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请求获取图表图片:
- 安装Express依赖:
npm install express
- 创建
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`); });
- 启动服务器:
node server.js
- 用curl调用接口获取图片:
curl http://localhost:3000/generate-chart > my-chart.png
或者自定义标题:
curl "http://localhost:3000/generate-chart?title=美国城市人口统计" > my-chart.png
内容的提问来源于stack exchange,提问作者Albert C
相关产品推荐
相关产品推荐

