【问题标题】:Undefined in accessing a nested object访问嵌套对象时未定义
【发布时间】:2020-01-14 23:26:48
【问题描述】:

我在访问名为result 的分层对象中的某个属性时遇到了困难:

result Object {
  "additionalUserInfo": hg {
    "isNewUser": true,
    "providerId": "password",
  },
  "credential": null,
  "operationType": "signIn",
  "user": Object {
    "apiKey": "some_api",
    "appName": "[DEFAULT]",
    "authDomain": "firebase.firebaseapp.com",
    "createdAt": "1579042072524",
    "displayName": null,
    "email": "qp@email.com",
    "emailVerified": false,
    "isAnonymous": false,
    "lastLoginAt": "1579042072524",
    "phoneNumber": null,
    "photoURL": null,
    "providerData": Array [
      Object {
        "displayName": null,
        "email": "qp@email.com",
        "phoneNumber": null,
        "photoURL": null,
        "providerId": "password",
        "uid": "qp@email.com",
      },
    ],
    "redirectEventId": null,
    "stsTokenManager": Object {
      "accessToken": "some_access_token",
      "apiKey": "some_api_key",
      "expirationTime": 1579045673373,
      "refreshToken": "some_refresh_token",
    },
    "tenantId": null,
    "uid": "some_uid",
  },
}

我想访问“some_access_token”,但我只能访问result.user,但如果我访问result.user && result.user.stsTokenManager

if(result.user.stsTokenManager){
   console.log(result.user.stsTokenManager.accessToken)
}

我也试过const accessToken = (((result || {}).user || {}).stsTokenManager || {}).accessToken 但仍未定义

更新

这就是我尝试访问变量的方式,但仍未定义。

 const submitHandler = async (input) => {
        const { email, password } = input && input
        let result;
        try {
            result = await Firebase.auth().createUserWithEmailAndPassword(email, password)
        } catch (err) {
            switch (err.code) {
                case 'auth/email-already-in-use':
                    console.log("message", err.message)
            }
        }
        const token = (((result || {}).user || {}).stsTokenManager || {}).accessToken
        console.log("accessToken", token)


        // or

        if (result.user.stsTokenManager) {
            console.log(result.user.stsTokenManager.accessToken)
        }

        // or
        console.log(result && result.user.stsTokenManager.accessToken)
    }

我什至尝试过 lodash:

const accessToken = _.get(result, ['user', 'stsTokenManger', 'accessToken'])

但仍未定义

奇怪的是我可以访问result.user.emailresult.user, emailVerifiedresult.user.providerDataresult.user.uid,但我在result.user.stsTokenManagerresult.user.lastLoginAtresult.user.createdAt 中得到undefined,即使当我@987654337 @,我可以清楚地看到变量被填充了。

【问题讨论】:

  • 如果结果是假的,那么{}.user 例如会抛出一个错误
  • 找不到问题 - result.user.stsAccessToken 适合我。您尚未发布您正在使用的实际代码。您确定您正在查看正确的变量,并且该变量具有您认为的数据吗?
  • 当我做console.log(result) 时,我得到了所有变量,所以我知道它们存在。我更新了代码以显示我如何尝试访问变量
  • 恐怕这只是简单的调试,用它来导航内存中的结果或使用手表,你会发现问题出在哪里。附言这伤害了我的眼睛 - (((result || {}).user || {}).stsTokenManager || {}).accessToken
  • @James 你能详细说明一下吗?我应该如何调试?

标签: javascript json reactjs firebase firebase-authentication


【解决方案1】:

要解决您的问题,您必须在之后添加:

result = await Firebase.auth().createUserWithEmailAndPassword(email, password)

下面一行:

const resData = await firebase.auth().currentUser.toJSON()

通过这种方式,您可以访问您正在寻找的所有数据。 例如,现在您可以通过以下方式获取accessToken

resData.stsTokenManager.accessToken

...

resData.stsTokenManager.expirationTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2021-08-02
    • 2021-08-22
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多