【问题标题】:"context.auth.uid" TypeError: Cannot read property 'uid' of undefined“context.auth.uid”类型错误:无法读取未定义的属性“uid”
【发布时间】:2019-05-09 21:10:43
【问题描述】:

我只是想使用 firebase 函数获取经过身份验证的用户的“uid”。但每次我在“firebase functions:shell”中运行该函数时。我得到这些错误。谁能帮我解决这个问题?

“context.auth.uid”TypeError:无法读取未定义的属性“uid”

exports.sendNewUser = functions.database.ref('/Users/')
.onCreate(async (snapshot, context) => {

    const userId = await context.auth.uid;

    const tokenPath = await admin.database().ref('Notify').once('value')

    var message = []

    tokenPath.forEach((childSnapshot) => {
        var allTokens = childSnapshot.val().expo

        if (allTokens) {
            message.push({
                "to": allTokens,
                "header": " Users",
                "body": "New user has been added, check them out!!!"
            })
        }
    })

    await fetch('https://exp.host/--/api/v2/push/send', {
        method: "POST",
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json"
        },
        body: JSON.stringify(message)
    })

    console.log("The user ID is : " + userId)

})

包.json:

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "dependencies": {
    "dateformat": "^3.0.3",
    "firebase-admin": "6.3.0",
    "firebase-functions": "^2.1.0",
    "node-fetch": "^2.3.0"
  },
  "devDependencies": {
    "eslint": "^4.12.0",
    "eslint-plugin-promise": "^3.6.0"
  },
  "private": true
}

【问题讨论】:

  • 您能分享一下您正在使用的 Firebase Functions 版本吗?你会在 package.json 文件中找到它。
  • 是的!我刚刚添加了它:)
  • 好的,你的版本看起来不错,即它符合你的参数。其他问题:您是否使用 auth 选项以特定最终用户身份运行您的功能,请参阅firebase.google.com/docs/functions/…
  • 另外,请注意,如果我没记错的话,您不应该这样做 const userId = await context.auth.uid; 而只是 const userId = context.auth.uid;
  • 是的,我浏览了文档!!!需要将身份验证添加到函数中,一旦我将其部署到云中,它会获取特定的登录用户uid 吗?!

标签: firebase react-native firebase-authentication google-cloud-functions


【解决方案1】:

onCreate 触发器将未定义 context.auth.uid,因为这是由云函数运行时触发的,而不是由创建文档的用户触发的。

https://stackoverflow.com/a/64345666/4868790

【讨论】:

    【解决方案2】:

    running Realtime Database triggers 的文档很清楚:

    默认情况下,shell 运行实时数据库函数 管理权限。使用 auth 选项改为运行 作为特定的最终用户或未经身份验证的用户发挥作用:

    # to mock unauthenticated user
    myDatabaseFunction('data', {authMode: 'USER'})
    # to mock end user
    myDatabaseFunction('data', {auth: {uid: 'abcd'}})
    

    您需要在上下文中传递最后一个模拟身份验证负载的对象。没有它,auth 将不包含任何内容。

    发布后就可以正常使用了。

    访问uid时不需要使用await。它不是一个异步函数。

    【讨论】:

    • 是的,我试过了 :) 现在一切正常,我在本地运行函数时收到通知,但在部署后,即使在创建新数据后也不会触发该函数,并且日志也没有显示: (
    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2021-11-22
    • 2017-08-12
    相关资源
    最近更新 更多