2017-12-17 13 views
0

Ich versuche, zwei Funktionen in einer Post-Anfrage auszuführen, aber nur eine wird ausgelöst. Die Funktion makeEntry wird ausgeführt, aber die Funktion hinterher renderEntries doesnt. Kann jemand bitte helfen? Hier ist der Code: https://codepaste.net/bpsxsyNode.js nur eine Funktion ausgeführt

+0

Könnten Sie bitte weitere Informationen zur Verfügung stellen? Irgendwelche Fehler, die Sie erhalten können? Tritt dies ein, wenn der Benutzer nicht angemeldet ist? – Kostas

+0

Wenn der Benutzer nicht angemeldet ist, wird send() ausgeführt und die Antwort erfolgt ohne renderEntries(). Aber renderEntries wird auch nicht ausgeführt, wenn der Benutzer angemeldet ist, res.send() wird nicht ausgeführt. –

+0

Ok, beide Funktionen werden ausgeführt, aber die Einträge werden nur auf Get-Request nicht auf Post –

Antwort

2

Dies ist aufgrund der Funktionsweise von Callbacks in Javascript. Hier ist der Teil, der zählt:

app.post('/guestbook_post', urlencodedparser, function(req, res){ 
    makeEntry(req, res, Guestbook); 
    renderEntries(res, Guestbook); 
    }); 

Sie passieren res auf beiden Funktionen. Aber makeEntry ruft res.send() auf, was bedeutet, dass es die Anforderung beendet und die Antwort zurück an den Client sendet. renderEntries wurde jedoch noch nicht ausgeführt, wartet aber immer noch in der Ereignisschleife. Es wird ausgeführt, wenn Sie das nächste Mal eine Post-Anfrage machen, was zu einem sehr verwirrenden und fehlerhaften Verhalten führt.

Um es als intendeed, funktioniert Refactoring-Funktionen makeEntry und renderEntries zu Rückkehr das benötigte Ergebnis Objekt und machen es einmal an den Client. Etwas wie dieses:

app.post('/guestbook_post', urlencodedparser, function(req, res){ 
    makeEntry(req, Guestbook, (err, entry) => { 
     renderEntries(entry, Guestbook, (err, result) => { 
      res.send(result); 
     }); 
    }); 
    }); 
+0

Thx aber res.send() wird nicht ausgeführt, wenn der Benutzer angemeldet ist. –

+0

Das ist eine andere Frage, die Sie separat ansprechen können. Markieren Sie diese Frage als "akzeptiert", wenn sie das Problem "nur eine ausgeführte Funktion" löst. –

Verwandte Themen