функция firebase возвращает до завершения обработки кода - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть это ниже триггера firebase

exports.on_order_received_deduct_doodle_cash = functions.database.ref("/orders/{id}")
    .onCreate((snapshot, context) => {
      console.log("start of on_order_received_deduct_doodle_cash")   

      const order = snapshot.val();
      const customerObj = order.customer
      const orderObj = order.order

      const paymentType = orderObj._paymentType
      console.log("payment type is::" + paymentType)

      if(paymentType === 'DoodleCash'){
        console.log("payment type is DoodleCash so deduct it from customer account")
        const afterDiscount = orderObj._afterDiscount
        const uid = customerObj._uid

        console.log("Customer uid is::" + uid)
        var db = admin.database();
        const userRef = db.ref('users/')
        userRef.child(uid).once("value").then(
            (resp) => {

                console.log("user value:" + JSON.stringify(resp))
                const userObj = resp.val()
                  let doodleCash = userObj._doodleCash
                  console.log("user current doodle cash is::" + doodleCash)
                  if(doodleCash === undefined)
                     doodleCash = 0

                  if(doodleCash > afterDiscount){
                    const val = doodleCash - afterDiscount

                    console.log("new doodle cash will be:" + val)
                    return userRef.child(uid).update({"_doodleCash" : val})
                  }else{
                        console.error("cannot be a negative value")
                        return null
                    }
            }
        ).catch(
            (err) =>  {
                            console.error("something went wrong:" + err)
                            return null
                     }
            )
      }else{
          return null
      }
})

Это одно из выполнений, где я могу увидеть, что метод завершен до того, как завершится тогда userRef.child (uid) .once ("value").Почему?или как исправить?Я полагаю, что мой код должен быть заблокирован и ждать его завершения, прежде чем он завершит триггер.Я что-то здесь упускаю?Пожалуйста, сообщите

2:25:44.698 AM
on_order_received_deduct_doodle_cash
something went wrong:TypeError: Cannot read property '_doodleCash' of null

2:25:44.698 AM
on_order_received_deduct_doodle_cash
user value:null

2:25:36.406 AM
on_order_received_deduct_doodle_cash
Function execution took 618 ms, finished with status: 'ok'

2:25:36.198 AM
on_order_received_deduct_doodle_cash
Function returned undefined, expected Promise or value

2:25:35.796 AM
on_order_received_deduct_doodle_cash
Customer uid is::3jwWMscY4mZGATQZg94d7wyRE143

2:25:35.796 AM
on_order_received_deduct_doodle_cash
payment type is DoodleCash so deduct it from customer account

2:25:35.796 AM
on_order_received_deduct_doodle_cash
payment type is::DoodleCash

2:25:35.788 AM
on_order_received_deduct_doodle_cash
Function execution started

1 Ответ

2 голосов
/ 28 сентября 2019

Как вы увидите в трех официальных видеороликах Firebase о «Обещаниях JavaScript» из серии видеороликов Firebase (https://firebase.google.com/docs/functions/video-series/), для облачных функций, запускаемых событиями, вы ДОЛЖНЫ вернуть обещание (илицепочка Обещаний) в вашей облачной функции, чтобы указать платформе, что вся асинхронная работа завершена.

Если вы этого не сделаете, может случиться, что платформа остановит выполнение вашей облачной функциичто, по-видимому, и происходит с вами.

Итак, вы должны адаптировать свой код следующим образом:

exports.on_order_received_deduct_doodle_cash = functions.database.ref("/orders/{id}")
    .onCreate((snapshot, context) => {
        console.log("start of on_order_received_deduct_doodle_cash")

        const order = snapshot.val();
        const customerObj = order.customer
        const orderObj = order.order

        const paymentType = orderObj._paymentType
        console.log("payment type is::" + paymentType)

        if (paymentType === 'DoodleCash') {
            console.log("payment type is DoodleCash so deduct it from customer account")
            const afterDiscount = orderObj._afterDiscount
            const uid = customerObj._uid

            console.log("Customer uid is::" + uid)
            var db = admin.database();
            const userRef = db.ref('users/')
            return userRef.child(uid).once("value")  // <- Note the return here
            .then(resp => {

                    console.log("user value:" + JSON.stringify(resp))
                    const userObj = resp.val()
                    let doodleCash = userObj._doodleCash
                    console.log("user current doodle cash is::" + doodleCash)
                    if (doodleCash === undefined) {
                        doodleCash = 0
                    }
                    if (doodleCash > afterDiscount) {
                        const val = doodleCash - afterDiscount

                        console.log("new doodle cash will be:" + val)
                        return userRef.child(uid).update({ "_doodleCash": val })
                    } else {
                        console.error("cannot be a negative value")
                        return null
                    }
            })
            .catch(
                (err) => {
                    console.error("something went wrong:" + err)
                    return null
                }
            )
        } else {
            return null
        }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...