我正在使用nodeJS express ejs。我的 JSON 出现问题,在渲染我的 ejs 文件之前没有填充数据。
app.get('/', function(req, res) {
fs.readFile('somepath', 'utf8', function(errRead, data) {
var obj;
if(errRead) {
obj = {loaded : false};
} else {
var nbCam = 0;
fs.readFile('somepath', 'utf8', function(errRead, data) {
if(errRead) throw errRead;
for(var i in JSON.parse(data).currentAcquisitionSet) {
++nbCam;
}
obj = {loaded : nbCam, images : JSON.parse(data).images};
});
}
console.log(obj); // why is it undefined here?
res.render('a.ejs', obj);});
});
});
看起来我的obj是一个局部变量,但我不明白为什么。
fs.readFile
的callback
在您登录obj
后调用,因为fs.readFile
是异步
的如果确实想以同步方式读取数据,可以使用fs.readFileSync
,或在回调中将渲染更改为
app.get('/', function(req, res, next) {
fs.readFile('somepath', 'utf8', function(errRead, data) {
var obj;
if(errRead) {
obj = {loaded : false};
res.render('a.ejs', obj);
return;
}
fs.readFile('somepath', 'utf8', function(errRead, data) {
if(errRead) {
return next(errRead);
}
var nbCam = 0;
for(var i in JSON.parse(data).currentAcquisitionSet) {
++nbCam;
}
obj = {loaded : nbCam, images : JSON.parse(data).images};
console.log(obj);
res.render('a.ejs', obj);
});
});
});
如果您只是尝试从磁盘读取 json 文件,则可以要求它:
var data = require('somepath');
这将在应用首次调用文件时同步加载文件一次,然后将其存储在 npm 缓存中。
我可能会在文件顶部与其他 require 语句一起调用它,而不是在路由处理程序中调用它,但这是我的偏好。