【问题标题】:Get request username firebase [VUE]获取请求用户名 firebase [VUE]
【发布时间】:2021-08-03 19:46:18
【问题描述】:

我正在尝试使用 Firebase 设置一个数据库,该数据库也有一个用户名字段。我正在使用来自 Google (https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts/signInWithPassword) 的身份工具包进行注册和登录操作。但据我所知,我无法在注册数据库中存储用户名,因为我无法更改表格和内容。这就是我创建自己的 Firebase 数据库的原因(见图,该数据库中的数据是通过 POST 请求存储的)。我要做的是通过 GET 请求获取用户名。

我可以建立与我自己的 Firebase 数据库的连接并获得正常响应。我正在使用以下代码执行此操作:

const responseUser = await fetch(
  `https://[firebase-link].firebasedatabase.app/users/${userId}.json`,
  {
    method: "GET",
  }
);

当我记录它时得到响应,状态为 200(这似乎是正确的连接),这很有效。在console.log中,我也可以清楚地看到我在请求中使用的对应的userId,它与数据库中的userId匹配。据我所知,我实际上在数据库中找到了正确的用户,但是没有地方可以找到用户名。第二个屏幕截图是我得到的响应。我尝试在响应中打开几乎所有选项,但我找不到数据库中的名称。

我知道我遗漏了一些可能非常简单的东西,但我似乎无法弄清楚。你们能帮帮我吗?

编辑: 我试图找到另一种方法来做到这一点,我正在返回所有用户的列表(无论如何不会那么多),然后我使用 for 循环遍历每个条目。见以下代码:

const responseUser = await fetch(
  `https://[firebase-link].firebasedatabase.app/users.json`,
  {
    method: "GET",
  }
);

// console.log(responseUser);

const responseUserData = await responseUser.json();
// console.log("ResponseUserData ===");
// console.log(responseUserData);

for (let userData in responseUserData) {
  let userId = responseData.localId;
  console.log("== userId");
  console.log(userId); // returns the user ID I need to filter the userData on

  console.log("== full user item");
  console.log(userData); // returns the user item, which contains userId and userName
  console.log("---------------------------------");

  // How do I filter to get the userName of userItem with corresponding userId?
}

现在我需要做的就是过滤 userItem,就像我在代码的最后注释中所说的那样。怎么样?

我尝试过以下方式过滤:

const user = responseUserData.filter(user => user.userId === userId)
console.log(user);

但这给了我一个错误Uncaught (in promise) TypeError: responseUserData.filter is not a function

【问题讨论】:

    标签: javascript firebase vue.js firebase-realtime-database get


    【解决方案1】:

    查看Fetch API 的文档:使用 fetch 的调用返回包含响应的 Promise(Response 对象)。然后,要从响应中提取 JSON 正文内容,该文档指出您需要使用 json() 方法,该方法“返回一个使用 JavaScript 对象解析的 Promise,该对象是将正文文本解析为 JSON 的结果”。

    文档显示了以下示例,使用了两次 then() 方法(即链接 Promises),因为返回了两个 Promise,如上所述。

    fetch('http://example.com/movies.json')
      .then(response => response.json())
      .then(data => console.log(data));
    

    在您的情况下,由于您使用async/await,因此以下方法可以解决问题:

    const response = await fetch(
          `https://[firebase-link].firebasedatabase.app/users/${userId}.json`,
          {
            method: 'GET',
          }
        );
    
    const responseData = await response.json();
    console.log(responseData);
    console.log(responseData.userName);
    

    【讨论】:

    • 感谢您的回复,我已经尝试过您建议的两种方式,但两次都返回 null。我在这里 (pastebin.com/udidv92i) 制作了我的代码的 pastebin。如果你能看看我做错了什么,我真的很感激。编辑:我从 fetch 链接中删除了 /${userId} 并且确实返回了用户列表。尽管您可以在我的初始屏幕截图中看到 userId != 到(对我而言)通过将用户添加到包含我的 userId 和 userName 的数据库中生成的随机值,对此有什么帮助吗?
    • 看来${userId}中userId的值不是你想的那样。你能调试这部分吗?您可以手动创建具有简单 id 的用户,例如; abcd 并尝试使用硬编码的网址(即https://[firebase-link].firebasedatabase.app/users/abcd.json)。
    • 我以另一种方式进行了尝试,归结为相同的测试。我不知道如何使用 2 个字段手动添加用户,所以我复制了随机字符串(我将其涂黑(红色)并以 M__qX0 开头),但我仍然得到与第二张图片类似的响应。我正在用其他选项稍微编辑我的问题,只需要最后一步。
    • 根据您上次的更新,您应该执行responseUserData.userName。与答案相同,只是变量名称发生了变化。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2019-02-25
    • 2020-10-05
    • 2019-05-28
    相关资源
    最近更新 更多