对全局变量以及如何使用它们的困惑
Confusion over global variables and how to use them
我想我对全局变量在 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);
,但现在有所不同。
我从未使用过 node.js 但基于您的结果
[Error: json is not defined].
我认为问题与以下内容有关
var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8');
var json = JSON.parse(data);
json 未被赋予值,因为数据无法声明,或者至少没有正确声明。
我建议你把数据的值写到控制台,然后从那里算出来。
console.log(data);
这里的 json
变量实际上不是全局变量。它位于您的节点模块范围内,其他模块无法访问它。
这意味着,当您的报告在其自身范围内解析和执行 "request.data={endpoints: json }; done();"
时,它并不知道 json
。
要回答关于何时使用全局变量的问题,稍微尖刻但有效的答案是 "never." 始终建议管理数据可访问性。相反,我建议您直接在上下文值中包含 json 数据,如下所示:
scripts: [{
content: "request.data={endpoints: " + JSON.stringify(json) + " }; done();"
}]
我想我对全局变量在 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);
,但现在有所不同。
我从未使用过 node.js 但基于您的结果
[Error: json is not defined].
我认为问题与以下内容有关
var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8');
var json = JSON.parse(data);
json 未被赋予值,因为数据无法声明,或者至少没有正确声明。
我建议你把数据的值写到控制台,然后从那里算出来。
console.log(data);
这里的 json
变量实际上不是全局变量。它位于您的节点模块范围内,其他模块无法访问它。
这意味着,当您的报告在其自身范围内解析和执行 "request.data={endpoints: json }; done();"
时,它并不知道 json
。
要回答关于何时使用全局变量的问题,稍微尖刻但有效的答案是 "never." 始终建议管理数据可访问性。相反,我建议您直接在上下文值中包含 json 数据,如下所示:
scripts: [{
content: "request.data={endpoints: " + JSON.stringify(json) + " }; done();"
}]