2017-10-24 5 views
2

Ich habe die App auf node.js mit der Verbindung zu Firebase. Ich muss die Daten korrekt aktualisieren.Die richtige Lösung für Versprechen

Wie man die Funktion getOrSetUserTrackDay (Tag) in einem Versprechen, um einen guten Wert zu erhalten, aber nicht undefiniert?

let userData = []; 
let userID = req.params.userID; 
let today = req.params.today; 
let yesterday = req.params.yesterday; 

db.collection('users').doc(userID).get() 
    .then((userDataFromDB) => { 
     if (!userDataFromDB.exists) { 
      res.status(404).send('User not found'); 
     } 
     else { 
      function getOrSetUserTrackDay(day) { 

       let userTrackRef = db.collection('history').doc('daily').collection(day).doc(userID); 
       userTrackRef.get() 
        .then(userTrackData => { 
         if (userTrackData.exists) { 
          return userTrackData.data(); // good 
         } 
         else { 
          let userNewData = { 
           username: userDataFromDB.data().username, 
           photoUrl: userDataFromDB.data().photoUrl 
          }; 
          userTrackRef.update(userNewData); 
          return userNewData; // good 
         } 
        }) 
      } 

      userData = { 
       user: userDataFromDB.data(), 
       today: getOrSetUserTrackDay(today), // undefined 
       yesterday: getOrSetUserTrackDay(yesterday) // undefined 
      }; 
      res.json(userData); 
     } 
    }) 
    .catch((err) => { 
     console.log(err); 
     res.status(404).send(err); 
    }); 
+0

gut 'getOrSetUserTrackDay' keine return-Anweisung hat, daher gibt es' undefined' - aber, da es asynchronen Code enthält, werden Sie nie es in der Lage sein zu verwenden synchron –

Antwort

1

gut getOrSetUserTrackDay hat keine return-Anweisung, daher gibt es undefined - aber, da es asynchronen Code enthält, werden Sie nie es in der Lage sein, synchron So

verwenden möchten, können Sie folgendermaßen vorgehen

let userData = []; 
let userID = req.params.userID; 
let today = req.params.today; 
let yesterday = req.params.yesterday; 
db.collection('users').doc(userID).get() 
.then((userDataFromDB) => { 
    if (!userDataFromDB.exists) { 
     res.status(404).send('User not found'); 
    } 
    else { 
     let getOrSetUserTrackDay = day => { 
      let userTrackRef = db.collection('history').doc('daily').collection(day).doc(userID); 
      return userTrackRef.get() 
      .then(userTrackData => { 
       if (userTrackData.exists) { 
        return userTrackData.data(); // good 
       } else { 
        let userNewData = { 
         username: userDataFromDB.data().username, 
         photoUrl: userDataFromDB.data().photoUrl 
        }; 
        userTrackRef.update(userNewData); 
        return userNewData; // good 
       } 
      }); 
     }; 
     Promise.all([getOrSetUserTrackDay(today), getOrSetUserTrackDay(yesterday)]) 
     .then(([today, yesterday]) => res.json({ 
      user: userDataFromDB.data(), 
      today, 
      yesterday 
     })); 
    } 
}).catch((err) => { 
    console.log(err); 
    res.status(404).send(err); 
}); 

Hinweis: getOrSetUserTrackDay aus einer Funktionsdeklaration zu einem Funktionsausdruck (in diesem Fall ein Pfeil Funktion ohne besonderen Grund) geändert - weil Function declarations should not be placed in blocks. Use a function expression or move the statement to the top of the outer function.

+0

Got Fehler (node: 5212) UnhandledPromiseRejectionWarning: Unbehandelte Versprechen Ablehnung (Zurückweisungs-ID: 2): TypeError: undefined ist keine Funktion (node: 5212) [DEP0018] DeprecationWarning: Nicht behandelte Verhornungsverweigerungen sind veraltet. In der Zukunft werden Ablehnungsverweigerungen, die nicht behandelt werden, den Node.js-Prozess mit einem Nicht-Null-Beendigungscode beenden. –

+1

klar habe ich nicht den .catch-Block enthalten, weil es OK war ... Kopieren/Einfügen ist ein Fluch - jetzt bearbeitet - obwohl, sicherlich sollten Sie es wieder hinzugefügt haben ¯ \\ _ (ツ) _/¯ - suchen wieder ... da muss ein Tippfehler meinerseits sein oder sowas "undefiniert ist keine Funktion" ... winder die Funktion ist "undefiniert" –

+1

Ahh, danke für den Beitrag @RomanMelnyk –

Verwandte Themen