Облачные функции не запускаются, окно браузера также зависает при попытке просмотра журналов

#javascript #firebase #google-cloud-firestore #firebase-authentication #google-cloud-functions

#javascript #firebase #google-cloud-firestore #firebase-аутентификация #google-cloud-функции

Вопрос:

Мои облачные функции все еще используют узел 8, пока не могут обновиться до узла 10

Я ожидаю, что моя облачная функция запустится, как только появится обновление в пользовательском документе

 exports.updateUser = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
  const after = change.after.data()
  if (after.status === 'VERIFIED') {
    console.log('EMAIL IS VERIFIED')
  }
  if (after.isVerified) {
    console.info(JSON.stringify(after))
    admin
      .auth()
      .getUser(after.uid)
      .then(() => {
        console.log('Email is verified')
        const metadataRef = admin.database().ref('metadata/'   userRecord.uid)
        return metadataRef.set({ refreshTime: new Date().getTime() })
      })
      .catch(error => {
        console.log(error)
      })
  }
  return
})
  

У меня это работало в прошлом, но не уверен, почему это не работает сейчас.

Прямо сейчас функция даже не вызывается, и когда я нажимаю «просмотреть журналы» на панели управления firebase, все мое окно браузера зависает — я не уверен, связано ли это с тем, что мои функции все еще используют узел 8

Я также могу подтвердить, что электронное письмо подтверждено после нажатия на ссылку, отправленную на мою электронную почту с помощью

 firebase
      .auth()
      .createUserWithEmailAndPassword(inputs.email, inputs.password)
      .then(res => {
        const userUid = res.user.uid
        const db = firebase.firestore()
        // setUser(userUid)
        db.collection('/users')
          .doc(userUid)
          .set({
            emailAddress: inputs.email,
            uid: userUid,
          })
        res.user.sendEmailVerification()
      })
      .catch(err => {
        setErrors(prev => [...prev, err.message])
      })
  }
  

Для доступа к user и emailVerfied также, как и для входа в систему, установлено значение true

Ответ №1:

Код вашей облачной функции будет генерировать некоторое «неустойчивое поведение», которое обычно приводит к тому, что вы испытали («У меня это работало в прошлом, но не уверен, почему это не работает сейчас»).

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

В вашем случае вы не только не возвращаете обещание, возвращенное getUser() , но у вас есть return в конце, которое может указывать облачной функциональной платформе, что она может очистить вашу функцию до завершения асинхронной работы.

Следующее должно сработать (непроверено):

 exports.updateUser = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
    const after = change.after.data()
    if (after.status === 'VERIFIED') {
        console.log('EMAIL IS VERIFIED')
    }
    if (after.isVerified) {
        console.info(JSON.stringify(after))
        return admin
            .auth()
            .getUser(after.uid)
            .then(() => {
                console.log('Email is verified')
                const metadataRef = admin.database().ref('metadata/'   userRecord.uid)
                return metadataRef.set({ refreshTime: new Date().getTime() })
            })
            .catch(error => {
                console.log(error)
                return null;
            })
    } else {
        return null;
    }
    
});
  

Комментарии:

1. Спасибо за подробный ответ, я не знал о завершении облачных функций, когда дело дошло до асинхронной работы. Хотя, даже с вашим обновленным кодом, похоже, он все еще не работает

2. «похоже, что это все еще не работает», видите ли вы какую-либо ошибку в журнале облачных функций?

3. Ошибок нет, я даже добавил консоль. войдите в систему при запуске функции, чтобы увидеть, срабатывает ли она — что не отображается. Я совсем потерялся