質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Google Charts

Google Chartsは、円グラフ・棒グラフ・折れ線グラフなどのさまざまなグラフをJavaScriptで容易に表示できる無料のライブラリ。デザインやイベント処理といったカスタマイズができ、商用利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

781閲覧

バックエンドでGoogle chartsを動かす際、コマンドライン引数を反映させたい

m.s.2000

総合スコア32

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Google Charts

Google Chartsは、円グラフ・棒グラフ・折れ線グラフなどのさまざまなグラフをJavaScriptで容易に表示できる無料のライブラリ。デザインやイベント処理といったカスタマイズができ、商用利用も可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/08/14 20:20

前提・実現したいこと

バックエンドでGoogle chartsを動かす際、コマンドライン引数を反映させたい。

発生している問題

コマンドライン引数をグローバル変数に格納してnpmで使えるgoogle-charts-nodeに読み込ませたいがエラーが発生してしまう。
具体的にはグラフタイトルの'Population_of_Largest_U.S._Cities' をコマンドライン引数で渡し、nodeで受け取り、グローバル変数に格納して
google-charts-nodeに読ませたいが、グローバル変数が見つからない旨のエラーが発生してしまうが、どのように修正すればよいでしょうか?

動作環境

さくらVPS
LINUX
CentOS8
Node.js
nodebrew
npm
Javascript
google-charts-node ⇒ https://github.com/typpo/google-charts-node

該当のソースコード

CentOS8

1◆node実行指示 2node sample.js 'Population_of_Largest_U.S._Cities' 3 4◆エラー表示 5Page error: Error: ReferenceError: title_input is not defined 6 at drawChart (about:blank:22:14) 7 at drawChartFn (about:blank:37:11) 8 at about:blank:44:24

Javascript

1◆sample.js 2 3const GoogleChartsNode = require('/root/node_modules/google-charts-node'); 4const fs = require('fs'); 5 6var title_input =process.argv[2]; //コマンドライン引数を受け取り、グローバル変数に格納 7 8// Define your chart drawing function 9function drawChart() { 10 const data = google.visualization.arrayToDataTable([ 11 ['City', '2010 Population',], 12 ['New York City, NY', 8175000], 13 ['Los Angeles, CA', 3792000] 14 ]); 15 16 const options = { 17 title: title_input, //グローバル変数を適用させたい 18 chartArea: {width: '50%'}, 19 hAxis: { 20 title: 'Total Population', 21 minValue: 0 22 }, 23 vAxis: { 24 title: 'City' 25 } 26 }; 27 28 const chart = new google.visualization.BarChart(container); 29 chart.draw(data, options); 30} 31 32// Render the chart to image 33(async () => { 34 const image = await GoogleChartsNode.render(drawChart, { 35 width: 400, 36 height: 300 37 }); 38 fs.writeFileSync('/var/www/html/google-chart1.png', image); 39})();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

下記のようにsample.js側で関数の内容を文字列として組み立てる必要があります。

js

1◆sample.js 2(略) 3const title_input = process.argv[2]; //コマンドライン引数を受け取り、グローバル変数に格納 4 5const drawChartFunc = ` 6function drawChart() { 7 const data = google.visualization.arrayToDataTable([ 8 ['City', '2010 Population',], 9 ['New York City, NY', 8175000], 10 ['Los Angeles, CA', 3792000], 11 ['Chicago, IL', 2695000], 12 ['Houston, TX', 2099000], 13 ['Philadelphia, PA', 1526000] 14 ]); 15 16 const options = { 17 title: '${title_input}', 18 chartArea: {width: '50%'}, 19 hAxis: { 20 title: 'Total Population', 21 minValue: 0 22 }, 23 vAxis: { 24 title: 'City' 25 } 26 }; 27 28 const chart = new google.visualization.BarChart(container); 29 chart.draw(data, options); 30} 31`; 32 33// Render the chart to image 34(async () => { 35const image = await GoogleChartsNode.render(drawChartFunc, { 36 width: 400, 37 height: 300 38}); 39fs.writeFileSync('./google-chart-variable-titled.png', image); 40})()

[元のコードでエラーが生じる理由]
GoogleChartsNode.render()関数の第一引数に関数を指定した場合、
指定された関数はそのまま文字列に変換され(※)、
puppeteerが起動するヘッドレスブラウザ内でパースされます。
※の部分で、関数内の式や変数等は展開されません。

したがって、あらかじめ式や変数等を展開した後の文字列を組み立てておいてから、render関数に渡す必要があります。

投稿2021/08/15 02:02

編集2021/08/15 02:08
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.s.2000

2021/08/15 15:41

今回も回答ありがとうございます。 アドバイス通り修正したら無事実行出来ました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問