我的应用程序从外部文件中获取数据并将其显示在我的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('/');
});
答案 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
和渲染页面的方式。