【问题标题】:Data missing after JSON.stringify a firebase objectJSON.stringify firebase 对象后数据丢失
【发布时间】:2019-12-11 07:23:19
【问题描述】:

我有一个链接到 Firebase 的应用。当用户登录时,我将他的对象firebase.auth().currentUser 分配给一个变量。然后,我向该变量添加一个属性 (username)。问题是当我console.log(currentUser) 时,我得到了带有添加属性的对象。但是,当我尝试 JSON.stringify 它然后 JSON.parse 它再次(我这样做是为了将其存储在 localStorage 上)我找不到我添加的属性 username。这里发生了什么事 ?

var currentUser = firebase.auth().currentUser

currentUser.username = 'Foo';

console.log(currentUser) // => i get my prop username here

console.log(JSON.parse(JSON.stringify(currentUser))) // => i cant find my added prop here

【问题讨论】:

  • 这是什么结果:console.log(localStorage.getItem('currentUser'))
  • 控制台中的对象是实时的(不是快照),并且会在记录后显示对它们所做的修改。尝试console.log(JSON.stringify(currentUser)) 可能会看到它是空对象,并且您遇到了同步问题
  • @AbderrahimSoubaiElidrissi 显然是 JSON 格式的相同对象
  • 请附上最少的复制品,以便我们提供可靠的建议。请参阅how to askcreating an mcve,了解有关提出有效问题和获得超级明星答案的一些重要提示。由于您正在获取 Firebase 管理的对象并对其进行修改,因此它可能会覆盖您的更改。将您需要的数据复制到您自己的对象中。还有,有什么意义?为什么要将 Firebase 提供的临时/可变数据存储在 localStorage 中?提示:它已经存储在那里。也许只是单独存储用户名?
  • @charlietfl true ,我该如何解决?

标签: javascript firebase firebase-authentication


【解决方案1】:

currentUser 不是普通对象,它是User class 的一个实例。如您所见,它实现了toJSON() 方法,JSON.stringify 自动检测并使用该方法作为将对象转换为 JSON 的规范方法。

如果您想将自定义属性合并到 Firebase 用户,您可以先添加 toJSON()

var currentUser = firebase.auth().currentUser.toJSON();

这会将用户对象转换为普通对象,然后可以添加其他属性并仍按预期进行序列化。但是请注意,这显然不会在用户服务器端或firebase.auth().currentUser 上持续存在。

【讨论】:

  • 非常感谢@Michael Bleigh!你无法想象我在这个答案中搜索的时间!在 Angular 上,如果您 (user$ | async),“普通”对象会打印在 HTML 上。但是每次我试图在 TS 上操纵它时……都会抛出错误!使用toJSON(),您只能获得“好”的属性 - 易于操作且没有错误!德克萨斯州!
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 2011-07-16
  • 2023-03-25
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多