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