0

nodejsでグローバル変数がどのように機能するかについて、私は少し混乱していると思います。私はこのコードを持っています:

var jsreport = require('jsreport-core')()
var fs = require('fs');
var path = require('path');
// make sure to pass the path to your `helper.js`
var helpers = fs.readFileSync(path.join('/Development/jsreport-new/data/templates/Sample report', 'helpers.js'), 'utf8');

var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8');
var json = JSON.parse(data);
jsreport.init().then(function () {
    return jsreport.render({
        template: {
            scripts: [{
                content: "request.data={endpoints: json }; done();"
            }],
            content: fs.readFileSync(path.join('/Development/jsreport-new/data/templates/Sample report', 'content.handlebars'), 'utf8'),
            helpers: helpers,
            engine: 'handlebars',
            recipe: 'phantom-pdf',
            phantom: {
                "orientation": "portrait",
                "format": "A3",    
                "margin": "3cm",
                "headerHeight": "3cm"
            },
        },
        data: {
            "books": [
                {"name": "A Tale of Two Cities", "author": "Charles Dickens", "sales": 351},
                {"name": "The Lord of the Rings", "author": "J. R. R. Tolkien", "sales": 125},
                {"name": "The Da Vinci Code", "author": "Dan Brown", "sales": 255},
                {"name": "The Hobbit", "author": "J. R. R. Tolkien", "sales": 99},
                {"name": "Carlskii", "author": "J. R. R. Tolkien", "sales": 99}
            ]
        }
    }).then(function(resp) {
        //prints pdf with headline Hello world
        console.log(resp.content.toString())
        resp.result.pipe(fs.createWriteStream('helloworld4.pdf'));
        setTimeout(function() {
            process.exit();
        }, 3000)
    });
}).catch(function(e) {
    console.log(e)
});

ローカル ファイルから読み取った json データを jsreport テンプレートに渡す必要があります。つまり、テンプレート内のコンテンツに渡す必要がありますcontent: "request.data={endpoints: json }; done();"

しかし、私はちょうど得[Error: json is not defined]ます。

次に、json 変数をグローバル変数として定義してみました。たとえばglobal.json = JSON.parse(data);、しかし、今は違います。

4

2 に答える 2

2

jsonここの変数は実際にはグローバルではありません。これはノード モジュールのスコープに対してローカルであり、他のモジュールはアクセスできません。

つまり、レポート"request.data={endpoints: json }; done();"が独自のスコープ内から解析および実行されるまでは、 json.

グローバル変数をいつ使用するかについてのあなたの質問に答えるには、少し皮肉ですが有効な答えは「決して」ではありません。データアクセシビリティの管理は常に推奨されます。代わりに、次のように、json データをコンテキスト値に直接含めることをお勧めします。

scripts: [{
    content: "request.data={endpoints: " + JSON.stringify(json) + " }; done();"
}] 
于 2016-04-09T16:53:51.477 に答える
0

node.js を使用したことはありませんが、結果に基づいています

[エラー: json が定義されていません]。

私は、問題が以下に関連していると信じるようになりました

var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8');
var json = JSON.parse(data);

データが宣言に失敗したか、少なくとも適切に宣言されていないため、json には値が与えられません。

データの値をコンソールに書き込んでから、そこから把握することをお勧めします。

console.log(data);
于 2016-04-09T16:50:07.813 に答える