Firebase 多路径更新 "invalid data; couldn't parse JSON object, array, or value"

Firebase multi-path update "invalid data; couldn't parse JSON object, array, or value"

当 Firebase 宣布 multi-path updates a while back. I have a fairly complex data structure that requires writes to several locations for managing relationships between entities, so multi-path updates came at the perfect time - I didn't have to worry about making several back-to-back writes/updates (and risk having Firebase rate-limit me 时,我很兴奋。

因此,我对所有内容进行了编码,系好安全带,并执行了多路径更新(使用 Rest API),结果却因以下响应而失望:

"error" : "Invalid data; couldn't parse JSON object, array, or value. Perhaps you're using invalid characters in your key names."

我查看了 the docs 以查看我是否使用了无效字符(.$#[], /) 在任何键名中。我不是(除了正斜杠,因为这是超级新的、很棒的多路径更新,允许在键中使用这样的字符)。

我很快在Chrome中打开Javascript控制台,运行JSON.parse()在我的字符串上,它解析成一个有效的table,所以有什么问题吗?

我的更新包含以下内容:

{
  "foo/bar": {
    "data": {
      "baz": 1
    }
  },

  "foo/bar/data": {
    "quu": 2
  }
}

在尝试使用官方支持@firebase.com 渠道失败后,我开始进行暴力调试。

我将每个 key/value 对分别解析为自己的 table 并尝试进行多路径更新,并且 每次都有效。 这是当我知道我正在做一些奇怪的事情时。然后我就慢慢的把整个table一键建起来,直到多路径更新失败,才看到问题。

我的更新包含以下内容:

{
  "foo/bar": {
    "data": {
      "baz": 1
    }
  },

  "foo/bar/data": {
    "quu": 2
  }
}

我希望在 Firebase 中得到结果数据:

{
  foo: {
    bar: {
      data: {
        baz: 1,
        quu: 2
      }
    }
  }
}

所以,简单的答案是,多路径更新不能包含写入同一位置(或同一路径中更深的位置)的两个键名。

现在,我的多路径更新包含超过 20 个 key/value 对,因此它不像我在此处列出的示例那样容易发现,所以请让我松懈一下。我可以理解为什么不允许这样做(请求的原子性、首先应用哪个更新等),但我的问题是 从 Firebase 返回的错误不仅没有帮助, 它完全指出了我错误的方向,使调试更加困难。

因此,答案是将写入 Firebase 中同一位置的两个多路径更新密钥组合起来,如下所示:

{
  "foo/bar/data" : {
    "baz": 1,
    "quu": 2
  }
}