【发布时间】:2026-02-14 02:35:01
【问题描述】:
尝试从 users 集合中的给定用户读取 pushToken(在对另一个集合进行更新操作之后)返回 undefined
exports.addDenuncia = functions.firestore
.document('Denuncias/{denunciaID}')
.onWrite((snap, context) => {
const doc = snap.after.data()
const classificadoId = doc.cid
const idTo = doc.peerId
db.collection('Classificados').doc(classificadoId)
.update({
aprovado: false
})
.then(r => {
getToken(idTo).then(token => {
// sendMsg...
})
}).catch(updateErr => {
console.log("updateErr: " + updateErr)
})
async function getToken(id) {
let response = "getTokenResponse"
console.log("id in getToken: " + id)
return db.collection('users').doc(id).get()
.then(user => {
console.log("user in getToken: " + user.data())
response = user.data().pushToken
})
.catch(e => {
console.log("error get userToken: " + e)
response = e
});
return response
}
return null
});
这是来自 FB 控制台日志:
-1:43:33.906 AM 函数执行开始
-1:43:36.799 AM 函数执行耗时 2894 毫秒,完成状态为:'ok'
-1:43:43.797 AM getToken 中的 ID:Fm1RwJaVfmZoSgNEFHq4sbBgoEh1
-1:43:49.196 AM 用户在 getToken:未定义
-1:43:49.196 AM error get userToken: TypeError: Cannot read property 'pushToken' of undefined
-1:43:49.196 AM 返回令牌:未定义
我们可以从 db 的截图中看到该文档确实存在:
希望有人能指出我在这里做错了什么。
【问题讨论】:
-
这里的第一个问题是您根本没有正确处理承诺。当所有异步工作完成时,您不会从*函数返回承诺,并且您的 getToken 函数总是将返回“getTokenResponse”。 Cloud Functions 并不是一个了解 Promise 工作原理的好地方。我建议花一些时间在更简单的环境中了解 JavaScript Promise 以了解它们的工作原理。
标签: firebase google-cloud-firestore google-cloud-functions