Mam tę bazę danych czasu rzeczywistego Firebase: Drzewo Firebase

Tworzę aplikację randkową, podobną do krzesiwa dla mojego kawalera. Tworzę teraz system meczowy.

Stworzyłem odbiornik onCreate, aby sprawdzać, kiedy użytkownik naciska przycisk Like i czy inny użytkownik naciskał już tak, jak na obecnym użytkowniku. Więc to jest to, czego próbowałem.

exports.UserPressesLike = functions.database
  .ref('/users/{userId}/matches/{otherUserId}')
  .onCreate((snapshot, context) => {
    // Grab the current value of what was written to the Realtime Database.
    const original = snapshot.val();
    const userId = context.params.userId;
    const matchedUserId = context.params.otherUserId;
    const a = checkUserMatch(userId, matchedUserId);
    if (a === true) {
      console.log('Its a match');
    } else {
      console.log('There is no match');
      console.log(a);
    }

    return null;
  });

checkUserMatch = async (userId, matchedUserId) => {
  const snapshot = await admin
    .database()
    .ref('/users/' + matchedUserId + '/matches/' + userId)
    .once('value')
    .then(snapshot => {
      // let tempuserId = snapshot.val();
      // if()
      return true;
    });
};

Chcę, aby checkUserMatch zwracał wartość true, jeśli istnieje ten węzeł, i false, jeśli nie ma takiego węzła.

0
Emilis 23 marzec 2020, 13:50

2 odpowiedzi

Najlepsza odpowiedź

Twoje checkUserMatch jest asynchroniczne (o czym świadczy fakt, że oznaczyłeś je za pomocą async), co oznacza, że nie zwraca natychmiast wartości, ale zwraca obiekt, który ostatecznie będzie zawierał wartość (a więc - zwana obietnicą).

Aby wywołać funkcję async, musisz wywołać ją za pomocą await:

const a = await checkUserMatch(userId, matchedUserId);

Oznacza to, że musisz również oznaczyć funkcję zawierającą wywołanie jako async, więc:

exports.UserPressesLike = functions.database
  .ref('/users/{userId}/matches/{otherUserId}')
  .onCreate(async (snapshot, context) => {

Pamiętaj, że zdecydowanie odradzam kontynuowanie, zanim nie dowiesz się więcej o asynchronicznych interfejsach API, obietnicach i async / await. Na przykład oglądając serię filmów Douga Poznaj obietnice JavaScript z wyzwalaczami HTTP w funkcjach chmury.

2
Frank van Puffelen 23 marzec 2020, 14:50

Po naprawieniu Pufa możesz sprawdzić, czy snapshot.val() !== null, lub użyć skrótu snapshot.exists().

I lepiej zmień nazwę swojego const snapshot na const isLiked, a następnie faktycznie zwróć to isLiked (lub ta funkcja zwróci undefined).

1
Stratubas 23 marzec 2020, 15:36