对全局变量的混淆以及如何使用它们

时间:2016-04-09 16:27:18

标签: javascript node.js jsreport

我认为我对于全局变量在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);,但它现在有所不同。

2 个答案:

答案 0 :(得分:2)

此处的<form name="login" id="login" method="post" action="do_login.php"> <input type="text" name="inp_1" id="inp_1"/> <button type="button" id="login_submit"></button> </form> <form name="registration" id="registration" method="post" action="do_registration.php"> <input type="text" name="inp_2" id="inp_2"/> <button type="button" id="registration_submit"></button> </form> <script type="text/javascript"> $("#login_submit").click(function(){ $("#login").submit(); }); $("#registration_submit").click(function(){ $("#registration").submit(); }); </script> 变量实际上并不是全局变量。它是节点模块范围的本地,没有其他模块可以访问它。

这意味着,当您的报告从其自己的范围内解析并执行json时,它就不会知道"request.data={endpoints: json }; done();"

要回答关于何时使用全局变量的问题,稍微讽刺但有效的答案是“从不”。始终建议管理数据可访问性。相反,我建议您直接在上下文值中包含json数据,如下所示:

json

答案 1 :(得分: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);