2017-04-07 7 views
-1

私のアプリは外部ファイルからデータを取得して、それを自分のejsビューに表示しています。ユーザーはポスト方式でデータを変更できます。それを保存し、ビューにすぐに表示する必要があります。ただし、新しいデータは、フォーム送信の2回目のクリック後にのみ表示されます。最初ではありません。NodeJsがファイルからデータをリロードして表示する

どうすれば変更できますか?

var info; 

fetchTag(); 

function fetchTag() 
{ 
    fs.readFile('tag.js','utf8',function(err,data){ 
    if(err){return console.log(err)}; 
    info = data;  
    }); 
} 

router.get('/',function(req,res){ 
    res.render('index',{tag: info}); 
}); 

router.post('/tag',function(req,res){ 
    fs.writeFile('tag.js',req.body.tag); 

    fetchTag(); 
    res.redirect('/'); 
}); 

答えて

0

fs.writeFile()は非同期関数です。つまり、.post()ルートがfetchTagを呼び出す前に実行が完了していないことを意味します。

また、fethcTag()関数も非同期であるため、getルートにリダイレクトするまでは終了しません。 fetchTag()に基づいてお試しください。

function fetchTag() { 

    return new Promise((resolve, reject)=>{ 
     fs.readFile('tag.js','utf8',function(err,data){ 
      if(err){ 
       reject(err) 
      } else { 
       info = data; 
       resolve(info); 
      } 
     }); 
    }); 
} 
router.post('/tag',function(req,res){ 

    fs.writeFile('tag.js', req.body.tag, (err) => { 
     if (err) throw err; 
     console.log('The file has been saved!'); 

    fetchTag().then((info)=>{ 
     res.redirect('/'); 
    }).catch((err)=>throw err); 
}); 

あなたはこのルートを行く、と私はそれが良いだろうと思うなら、あなたはinfoとあなたのページをレンダリング処理する方法を変更することができます。

+0

ここで唯一の問題は、 'tag.txt'や' tag.json'ではなく 'tag.js'というファイルを呼び出したことだけです。その根拠は何ですか? – wlh

関連する問題