无法从云功能中的文档获取数据(返回未定义)

时间:2019-05-21 10:57:38

标签: javascript firebase google-cloud-firestore google-cloud-functions

我有一个包含2个字段的文档:field1,field2(为简单起见,更改了名称)。

我正在从一个云函数中尝试从field1获取值。该函数不是该特定文档的触发器,我得到的值是这样的:

const user_collection = db.collection("user")
const photoName = user_collection.doc(userid).field1

但是,我在undefined中得到的回报。我尝试使用data()或get()方法,但最终出现错误...is not a function。在文档或SO中找不到任何可以帮助我从文档中获取字段值的东西。

关于如何提取该字段的任何建议?

编辑:

exports.onUserDeletion = functions.auth.user().onDelete((user) => {

    const userid = user.uid
    const photoName = user_collection.doc(userid).photo    //<--- this is "undefined"
    const filePath = `user_photo/${photoName}`
    const file = bucket.file(filePath)

    console.log(`userid: ${userid} photoName: ${photoName} filePath: ${filePath} file: ${file}`)

    return highscore_collection.doc(userid).delete().then(user => {
        return user_collection.doc(userid).delete().then(user => {
            return file.delete()
        })
    })

})

enter image description here

2 个答案:

答案 0 :(得分:2)

您应该执行以下操作:

exports.deleteUser = functions.firestore.document('user/{userID}').onDelete((snap, context) => {
        const deletedValue = snap.data().photo;
});

来自docs

  

使用带有通配符的onDelete()函数删除文档时,您也可以触发函数。


在您的代码中,您使用的是authentication trigger,这就是为什么您无法访问文档中的photo字段的原因。

来自docs

  

onDelete

     

每次删除Firebase身份验证用户时都会触发的事件处理程序。

onDelete()的参数类型为UserRecord。您可以在此处检查UserRecord的属性:

https://firebase.google.com/docs/reference/functions/functions.auth.UserRecord.html

答案 1 :(得分:1)

用户已被删除。这就是为什么无法从数据库中获取它的原因。

exports.onUserDeletion = functions.auth.user().onDelete((user) => {   
        const userid = user.uid
        const photoName = user.photo    //<--- this is "undefined"
        const filePath = `user_photo/${photoName}`
        const file = bucket.file(filePath)

        console.log(`userid: ${userid} photoName: ${photoName} filePath: ${filePath} file: ${file}`)

        return highscore_collection.doc(userid).delete().then(user => {
            return user_collection.doc(userid).delete().then(user => {
                return file.delete()
            })
        })

    })