teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2021/08/15 02:08

投稿

退会済みユーザー
answer CHANGED
@@ -1,42 +1,5 @@
1
- 1./root/node_modules/google-charts-node/lib/render.js の10行目あたりを下記のように書き換えます。
2
- (先頭が-なっいる行は削除、+となっ行を追加)
1
+ 下記のようにsample.js側で関数の内容を文字列組み立てる必要があります。
3
2
 
4
- ```diff
5
- async function renderGoogleChart(contentRaw, optsRaw) {
6
- let content = contentRaw;
7
- if (typeof contentRaw === 'function') {
8
- - content = `const drawChart = (${contentRaw.toString()});`;
9
- + content = `const title_input=\"${process.argv[2]"}\"\nconst drawChart = (${contentRaw.toString()});`;
10
- }
11
- 以下略
12
- ```
13
-
14
-
15
- 2.sample.jsの title_input の定義行は不要なので削除します。
16
- ```diff
17
- ◆sample.js
18
-
19
- const GoogleChartsNode = require('/root/node_modules/google-charts-node');
20
- const fs = require('fs');
21
-
22
- -var title_input =process.argv[2]; //削除
23
- 以下略
24
- ```
25
-
26
- ---
27
- [sample.js内で定義した変数が反映されず上記のエラーが生じる理由]
28
- GoogleChartsNode.render()関数の第一引数に関数を指定した場合、
29
- 指定された関数はそのまま**文字列**に変換され(※)、
30
- puppeteerが起動するヘッドレスブラウザ内でパースされます。
31
- ※の部分で、関数内の式や変数等は展開されません。
32
-
33
- したがって、render関数内で関数の内容を文字列に変換する場所で、input_title変数の定義を追加する必要があります。
34
-
35
-
36
- ---
37
- [別解]
38
- ライブラリのコードをいじるのに抵抗があるなら、下記のようにsample.js側で関数の内容を文字列として組み立てるやり方もあります。
39
- こちらの方がおすすめかもしれません。
40
3
  ```js
41
4
  ◆sample.js
42
5
  (略)
@@ -78,4 +41,13 @@
78
41
  });
79
42
  fs.writeFileSync('./google-chart-variable-titled.png', image);
80
43
  })()
81
- ```
44
+ ```
45
+
46
+ ---
47
+ [元のコードでエラーが生じる理由]
48
+ GoogleChartsNode.render()関数の第一引数に関数を指定した場合、
49
+ 指定された関数はそのまま**文字列**に変換され(※)、
50
+ puppeteerが起動するヘッドレスブラウザ内でパースされます。
51
+ ※の部分で、関数内の式や変数等は展開されません。
52
+
53
+ したがって、あらかじめ式や変数等を展開した後の文字列を組み立てておいてから、render関数に渡す必要があります。

1

2021/08/15 02:08

投稿

退会済みユーザー
answer CHANGED
@@ -36,7 +36,7 @@
36
36
  ---
37
37
  [別解]
38
38
  ライブラリのコードをいじるのに抵抗があるなら、下記のようにsample.js側で関数の内容を文字列として組み立てるやり方もあります。
39
-
39
+ こちらの方がおすすめかもしれません。
40
40
  ```js
41
41
  ◆sample.js
42
42
  (略)