NodeJ将数据从文件重新加载到视图

时间:2017-04-07 03:22:26

标签: node.js express

我的应用程序从外部文件中获取数据并将其显示在我的ejs视图中。用户可以通过post方法更改数据。然后它应该保存并立即显示在视图上。但是,只有在第二次单击表单提交后才会显示新数据。不是第一个。

如何更改?

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('/');
});

1 个答案:

答案 0 :(得分: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和渲染页面的方式。