Google云功能-承诺会导致执行错误

时间:2019-09-15 13:07:03

标签: javascript firebase-realtime-database google-cloud-functions es6-promise

我在Google Cloud Functions中有一个使用诺言的预定工作。 在第一次执行时,在新部署之后,代码可以工作,但是第一次执行后的所有执行都会失败-由“测试功能”安排和触发。

我怀疑我的诺言是问题的根源,但我无法弄清楚哪里出了问题。

我的代码结构

googleCloufFunction.onRun()
  firebaseCall.once().forAll(note)
    Promise.all(lookupPromise)
    .then(addNotification) //return Promise.all(notificationPromises)
    .then(sendEmail) //return Promise.all(sendEmailPromises)
    .then(udpate note)

第一次执行时,我得到以下日志记录

  

console.log('lookupPromises-MembersToAlert')

     

console.log(“ lookupPromises完成”)

     

console.log('sendEmail')

     

console.log('更新数据库')

     

...

第一次执行后,日志将在

后停止
  

console.log('lookupPromises-MembersToAlert')

我的代码

exports.notification_email = functions.region('europe-west1')
.pubsub.schedule('0 * * * *').timeZone('Europe/Stockholm')
.onRun((event) => {
  //Search for notes with passed alertDate
  database.ref('notes/').orderByChild('data/alertDate').endAt(moment().valueOf())
  .once('value', (snapshot) => {
    snapshot.forEach( (data) => { 
      //Get membersToAlert and isAlreadyProcessed
      //...

      if (!isAlreadyProcessed) {
        //Get category name
        let lookupPromises = []
        console.log('lookupPromises - category name')
        //Push promise - returns category title for current node
        //...

        //Get membersToAlert email addresses and names
        console.log('lookupPromises - membersToAlert')
        membersToAlert.forEach((memberId, index) => {
          //Push promise - returns an object {userName, userEmail}
        })

        //Perform lookup and promise chain rest of the calls 
        return Promise.all(lookupPromises)
        .then((lookupArray)=>{
          //Collect variables from lookupPromises response
          //...
          console.log('lookupPromises completed')

          //addDbNotification performs and returns Promise.all()
          return addDbNotification(...) //Needs result from lookupPromises
        })
        .then(()=>{
          //Send email 
          console.log('sendEmail')
          //sendMail performs and returns Promise.all()
          return sendEmail(...) //Needs result from lookupPromises
        })
        .then(()=>{
          //Update database
          console.log('update database')
          return dbRef.update( {"sys/sentEmail": true} )
        })
        .catch((err)=>{
          console.log('notification_email Error', err)
          return false
        })

      }//End if (!alreadyProcessed)

      return true
    })//End snapshot.forEach

    return true
  })//End firebase .once()
  .then(()=>{
    return true
  })
  .catch((err)=>{
    console.log("Cronjob error", err)
  })

  // return true
})//End exports.notification_email

addDbNotification

const addDbNotification = () => {
  //This function needs data from "lookupPromises"
  let promises = [] 
  membersToAlert.forEach((memberId, index) => {
    //Push promises to 1. add notification and 2. update counter for each "membersToAlert"
  })
  return Promise.all(promises).catch((err)=>{
    console.log('addDbNotification Error', err)
  })
}

sendMail()

const sendEmail = () => {
  //This function needs data from lookupPromises
  let mailPromises = []
  //Push promise to send mail to each "mailRecipientsArray" 
  return Promise.all(mailPromises).catch((err)=>{
    console.log("sendEmail error", err)
  })
}

我想要实现的目标是:

  1. 查找所有过期的笔记
  2. 处理每个笔记
  3. 为每个注释收集“ categoryId”和“ membersToAlert”
  4. 为每个注释的每个“ membersToAlert”写警报并计数器到数据库
  5. 为每个笔记发送电子邮件至每个“ membersToAlert”
  6. 完成后更新数据库中的注释
  7. 完成执行和清理

截至目前,日志显示执行结束为​​时过早

  

hourly_job-notification_email [procId]函数执行开始hourly_job-notification_email

     

hourly_job-notification_email [procId]开始hourly_job-notification_email

     

hourly_job-notification_email [procId]函数返回的值未定义,预期的承诺或值

     

hourly_job-notification_email [procId]函数执行耗时199毫秒,状态为:“ ok” hourly_job-notification_email

     

hourly_job-notification_email [procId] lookupPromises-类别名称hourly_job-notification_email

     

hourly_job-notification_email [procId] lookupPromises-MembersToAlert hourly_job-notification_email

任何帮助,不胜感激!

0 个答案:

没有答案