【发布时间】:2020-07-07 23:24:12
【问题描述】:
如果users/{userId} 上有文档更新,我正在尝试启动我的云功能
我有一个每次用户登录时都会触发的登录方法
signin: (email, password, setErrors) => {
firebase
.auth()
.signInWithEmailAndPassword(email, password)
.then(() => {
const isVerified = firebase.auth().currentUser.emailVerified
const userUid = firebase.auth().currentUser.uid
const db = firebase.firestore()
if (isVerified) {
db.collection('/users')
.doc(userUid)
.update({ isVerified: true })
}
})
.catch(err => {
setErrors(prev => [...prev, err.message])
})
},
没什么特别的,除了基本的登录内容外,它还会检查用户是否验证了他们的电子邮件,如果验证通过,它将更新该用户的集合。这里的一切都按预期工作。
但是我似乎无法启动我的云功能。
基本上,它正在监听user 集合上的变化。如果users/{userId} 文档有isVerified 并且用户电子邮件地址以xxxx 结尾,它应该授予他们管理员权限。
exports.updateUser = functions.firestore.document('users/{userId}').onUpdate((change, context) => {
const after = change.after.data()
if (after.isVerified) {
firebase.auth().onAuthStateChanged(user => {
if (user.emailVerified && user.email.endsWith('@xxxx')) {
const customClaims = {
admin: true,
}
return admin
.auth()
.setCustomUserClaims(user.uid, customClaims)
.then(() => {
console.log('Cloud function fired')
const metadataRef = admin.database().ref('metadata/' + user.uid)
return metadataRef.set({ refreshTime: new Date().getTime() })
})
.catch(error => {
console.log(error)
})
}
})
}
})
现在函数没有触发,有什么想法吗?
【问题讨论】:
-
它可能正在触发,只是没有进入那么大的 if() {...} 你怎么知道它没有触发?你检查你的函数日志并检查它是否没有触发?
-
是的,我做了,日志是空的
-
在 if (after.isVerified) {} 之前放置一个日志,然后重试。类似于 console.info(JSON.stringify(after))
-
好的,看起来它正在触发,但代码块(after.isVerified)没有执行......我是否有可能无法使用 firebase.auth() 检索用户?跨度>
-
确实是这个问题。我会写一个答案。
标签: node.js firebase google-cloud-firestore google-cloud-functions