2017-04-07 4 views
-1

Meine App holt Daten von externen Dateien und zeigt sie in meiner EJS-Ansicht an. Der Benutzer kann Daten per Post-Methode ändern. Dann sollte es gespeichert und sofort in der Ansicht angezeigt werden. Neue Daten werden jedoch erst nach einem zweiten Klick auf das Senden des Formulars angezeigt. Nicht zuerst.NodeJs laden Daten von Datei zur Ansicht

Wie kann ich es ändern?

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

Antwort

0

fs.writeFile() ist eine asynchrone Funktion. Dies bedeutet, dass es nicht fertig ausgeführt wird, bevor Ihre Route .post() fetchTag aufruft.

Dann, weil Ihre fethcTag() Funktion auch asynchron ist, wird es nicht beendet, bis Sie zurück auf Ihre Route zu leiten. Versuchen Sie, versprechen basiert.

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

Wenn Sie diesen Weg gehen, und ich denke, es wäre besser, können Sie die Art und Weise Sie behandeln ändern info und Ihre Seite zu machen.

+0

Das einzige andere Problem, das Sie hier haben werden, ist die Tatsache, dass Sie Ihre Datei 'tag.js' und nicht' tag.txt' oder 'tag.json' aufgerufen haben. Was ist der Grund dafür? – wlh