2017-04-04 42 views
0

函數正在觀察proposals/{jobid}/{propid}。當添加新建議並且child("isinvitation")爲空時,該功能成功地將新節點寫入proposals/sent,然後將增量添加到作業jobs/${jobid}的建議子項。Firebase的雲端函數在執行前中斷

當提案被移除時,該功能失效。 userRef.child(jobid).remove()也不觸發,減少對作業jobs/${jobid}的提案子不發生。

exports.CountProposals = functions.database.ref("/proposals/{jobid}/{propid}").onWrite((event) => { 
    const jobid = event.params.jobid; 
    const userId = event.params.propid; 
    const isinvitation = event.data.child("isinvitation").val(); 
    if (!isinvitation) { 
     const userRef = admin.database().ref(`users/${userId}/proposals/sent`); 
     if (event.data.exists() && !event.data.previous.exists()) { 
      userRef.child(jobid).set({ 
       timestamp: admin.database.ServerValue.TIMESTAMP 
      }); 
     } else if (!event.data.exists() && event.data.previous.exists()) { 
      userRef.child(jobid).remove(); 
     } 
    } 
    const collectionRef = admin.database().ref(`/jobs/${jobid}`); 
       return collectionRef.once('value').then(snapshot => { 
         if (snapshot.val() !== null) { 
          const countRef = collectionRef.child("proposals"); 
          countRef.transaction(current => { 
              if (event.data.exists() && !event.data.previous.exists()) { 
                  return (current || 0) + 1; 
              } else if (!event.data.exists() && event.data.previous.exists()) { 
                  return (current || 0) - 1; 
              } 
          }); 
         } 
       }); 
}); 

控制檯日誌不顯示任何錯誤。

回答

0

你的函數試圖在幾個地方做幾次寫操作。這些寫作中的每一個都將產生一個跟蹤其完成的不同承諾。你應該返回一個單一的承諾,當所有的工作完成時解決。就目前而言,你只是從collectionRef.once('value').then()中返回一個單一的承諾,它本身並沒有返回跟蹤交易完成的另一個承諾。

基本上,您需要小心跟蹤所有帶有承諾的寫入,並且通常使用Promise.all()來等待所有未完成的工作。

+0

我正在處理event.data.child(「isinvitation」).val()的空值。對我來說,使用之前的值是沒有意義的。 –

+0

我不清楚你的功能應該做什麼。你主要說的是它不是*做的。還要記住,你需要從一個可以工作的函數中返回一個承諾,比如更新數據庫。現在你沒有使用從更新(remove,transaction)返回的任何promise。 –

+0

當新數據和isinvitation = false寫入或刪除數據庫'users/$ {userId}/proposals/sent'中的數據,然後增加或減少'/ jobs/$ {jobid}中的值提議時, –

0

「每次發生Firebase實時數據庫寫入時都會觸發的事件處理程序」。 - https://firebase.google.com/docs/reference/functions/functions.database.RefBuilder#onWrite

我個人已經期待得到觸發了刪除操作爲好,但是,它可能類似於AngularFire,其中write操作不被認爲是remove操作。

你可以看看這個,看看你能得到它與你的情況下工作:https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot#changed

編輯:嘗試一些我自己的職能,他們似乎觸發取消對我之後。我會更多地研究你的代碼。

相關問題