2017-11-20 2 views
0

Ich will Cloud-Funktion für Firestor schreiben, die task.elapsedCount verringern wird und user.points + = 3 in zwei parallelen Threads machen:
Cloud-Funktionen: Firestor lösen

exports.taskDoneFunc = functions.firestore 
.document('/tasks/{taskId}') 
.onUpdate(event => { 

    const taskRef = event.data.ref; 
    const root = taskRef.root; 

    return taskRef.get() 
     .then(taskSnap => { 

      let task = taskSnap.data(); 

      task.elapsedCount -= 1; 

      taskRef.set(task, {merge: true}) 

      return root.document('/users/${task.taskOwner_uid}').get() 

     }).then(userSnap => { 

      let user = userSnap.data(); 

      user.points += 3; 

      return userSnap.ref.set(user) 

     }) 
}); 

erste Versprechen funktionieren gut und ich sehe, Änderungen in Aufgabe Firestore "Aufgabe" Dokument, aber zweite sagt "Kann nicht lesen 'Dokument' von undefined".
Ich habe keine sauberen Beispiele für Cloud-Funktionen für Firestore-Datenbank-Trigger gefunden, das ist verrückt Beta? :(

Antwort

1

Ich glaube nicht, root in einem Firestor DocumentReference (docs) definiert Stattdessen glaube ich Sie firestore (docs) verwendet werden sollen, die die Top-Level-Firestore-Datenbank erhält.

exports.taskDoneFunc = functions.firestore 
.document('/tasks/{taskId}') 
.onUpdate(event => { 

    const taskRef = event.data.ref; 
    const db = taskRef.firestore; 
    const task; 

    return taskRef.get() 
     .then(taskSnap => { 
      task = taskSnap.data(); 
      task.elapsedCount -= 1; 
      return taskRef.set(task, {merge: true}) 
     }).then(() => { 
      return db.collection('users').doc(task.taskOwner_uid).get(); 
     }).then(userSnap => { 
      let user = userSnap.data(); 
      user.points += 3; 
      return userSnap.ref.set(user) 
     }) 
}); 

ich denke, es war auch eine mögliche race-Bedingung mit zwei Asynchron-Funktionen (der Satz von der get gefolgt)

+0

Ich habe gerade herausgefunden, wie Sie mit Funktionen in Firestore arbeiten: nur admin.firestore(). Doc ('/ users/$ {uid}') .get() - wie Anrufe. – android51130

0

ich habe gerade HowTo Arbeit mit Funktionen in Firestor herausgefunden. nur

admin.firestore(). Doc (/ Benutzer/$ {uid}). Erhalten()

-ähnlichen Anrufe. Wenn es für jemanden hilfreich ist :)

Verwandte Themen