当nodejson应该是全局的时候,它是本地的

当nodejson应该是全局的时候,它是本地的,json,node.js,express,ejs,Json,Node.js,Express,Ejs,我正在与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 {

我正在与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是一个局部变量,但我不明白为什么。

在您登录
obj
后,会调用
fs的
回调

如果确实希望以同步方式读取数据,则可以在回调中使用或将渲染更改为

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);
        });
    });
});

fs.readFile
回调
在您以异步方式登录
obj
后被调用

如果确实希望以同步方式读取数据,则可以在回调中使用或将渲染更改为

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语句调用它,而不是在路由处理程序中,但这是我的首选

如果您只是试图从磁盘读取json文件,您可以要求它:

var data = require('somepath');
这将在应用程序首次调用文件时同步加载该文件一次,然后将其存储在npm缓存中


我可能会在文件顶部用其他require语句调用它,而不是在路由处理程序中,但这是我的首选

谢谢,我完全忘记了异步部分。谢谢,我完全忘记了异步部分。