2017-04-07 70 views
-1

我的應用程序正在從外部文件提取數據並將其顯示在我的ejs視圖中。用戶可以通過post方法更改數據。然後它應該立即保存並顯示在視圖上。但是,只有在第二次點擊表單提交後纔會顯示新數據。不是第一個。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.js'而不是'tag.txt'或'tag.json'。那裏的基本原理是什麼? – wlh

相關問題