#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. Ошибок нет, я даже добавил консоль. войдите в систему при запуске функции, чтобы увидеть, срабатывает ли она — что не отображается. Я совсем потерялся