2017-07-11 2 views
1

私はnodeJS express ejsで作業しています。私は自分のJSONに問題がありますが、私のejsファイルをレンダリングする前にデータが入力されていません。NodeJS JSONはローカルでなければなりません

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ため

答えて

0

callbackはあなたが同期形式でデータを読みたいなかった場合、レンダリング、あなたがfs.readFileSyncを使用するか、または変更することができます非同期

あるobjfs.readFileとしてログインし後に呼び出されますコールバック内へ

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

ありがとう、私は完全に非同期部分を忘れてしまった。 – TheRelax

0

ディスクからjsonファイルを読み込もうとしている場合は、あなたはそれを必要とすることができます

var data = require('somepath'); 

これは同期その後、NPMキャッシュに格納し、アプリケーションが最初にそれを呼び出して1時間のファイルをロードします。

私はたぶんルートハンドラの内部ではなく、他のrequireステートメントを持つファイルの先頭でそれを呼び出すでしょうが、それは私の好みです。

関連する問題