问题描述
我的云功能仍在使用节点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
解决方法
您的Cloud Function代码将生成一些“不正常的行为”,通常会导致您遇到的事情(“我过去曾做过,但不确定为什么现在不行”。
所有异步工作完成后,您需要终止Cloud Function,请参见doc。对于后台触发的Cloud Function,您需要返回异步方法调用返回的承诺链。
在您的情况下,不仅您不退回getUser()
返回的承诺,而且末尾还有一个return
,这可能表明Cloud Function平台可以清理您的功能在异步工作完成之前。
以下应该可以解决这个问题(未测试):
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;
}
});