【问题标题】:Pushing array to Firebase via REST API通过 REST API 将数组推送到 Firebase
【发布时间】:2016-12-29 22:58:40
【问题描述】:

问题

我如何(通过单个 HTTP 请求REST API)向 Firebase 写入一个 数组 并为每个数组元素指定一个 (非整数)唯一 ID

As described here.


数据

我要写的数据如下所示。

数据写入.js
myArray = [ {"user_id": "jack", "text": "Ahoy!"},
            {"user_id": "jill", "text": "Ohai!"} ];

目标

完成后,我希望我的 Firebase 如下所示。

my-firebase.firebaseio.com
{
  "posts": {
    "-JRHTHaIs-jNPLXOQivY": { // <- unique ID (non-integer)
      "user_id": "jack",
      "text": "Ahoy!"
    },
    "-JRHTHaKuITFIhnj02kE": { // <- unique ID (non-integer)
      "user_id": "jill",
      "text": "Ohai!"
    }
  }
}

希望它看起来像下面这样......

my-anti-firebase.firebaseio.com
// NOT RECOMMENDED - use push() instead!
{
  "posts": {
    "0": {  // <- ordered array index (integer)
      "user_id": "jack",
      "text": "Ahoy!"
    },
    "1": {  // <- ordered array index (integer)
      "user_id": "jill",
      "text": "Ohai!"
    }
  }
}

I note this page where it says:

[...] 如果所有键都是整数,并且对象中 0 到最大键之间的键中有一半以上具有非空值,则 Firebase 会将其呈现为数组。

代码

因为我想在单个 HTTP 请求中执行此操作,所以我想避免迭代数组中的每个元素,而是想在单个请求中推送一批。

换句话说,我想做这样的事情:

伪代码.js
curl -X POST -d '[{"user_id": "jack", "text": "Ahoy!"},
                  {"user_id": "jill", "text": "Ohai!"}]' \
                  // I want some type of batch operation here
  'https://my-firebase.firebaseio.com/posts.json'

但是,当我这样做时,我得到的正是我上面描述的我不想要的(即顺序整数键)。

我想避免做这样的事情:

反伪代码.js
for(i=0; i<=myArray.length; i++;){ // I want to avoid iterating over myArray
  curl -X POST -d '{"user_id": myArray[i]["user_id"],
                    "text": myArray[i]["text"]}' \
    'https://my-firebase.firebaseio.com/posts.json'
}

有可能实现我所描述的吗?如果有,怎么做?

【问题讨论】:

    标签: api rest firebase firebase-realtime-database


    【解决方案1】:

    我认为没有办法使用 Firebase API 来执行此操作,如 OP 中所述。

    但是,可以使用如下的服务器脚本来完成:

    1. 遍历每个数组元素。
    2. 为每个元素分配一个唯一的 ID(由服务器脚本生成)。
    3. 创建一个返回对象,键是唯一的 ID,值是对应的数组元素。
    4. 使用 patch 方法通过单个 HTTP 请求将对象写入 Firebase。因为post 为整个对象本身创建了一个新的 Firebase 生成 ID。鉴于,patch 没有;它直接写入父节点。
    脚本.js
    var myObject = {},
    i = myArray.length;
    while(i--){
      var key = function(){ /* return unique ID */ }();
      myObject[key] = myArray[i];
    }
    curl -X PATCH -d JSON.stringify(myObject) \
    'https://my-firebase.firebaseio.com/posts.json'
    

    【讨论】:

    【解决方案2】:

    您使用 POST 的决定是正确的。导致数字索引作为键的原因是因为您的有效负载是一个数组。每当您发布/放置和数组时,键始终是索引。如果您希望服务器为您生成密钥,请一一发布您的对象。

    【讨论】:

      【解决方案3】:

      仅当您使用 POST 时,Firebase 才会生成唯一 ID。如果使用PATCH,则不会生成唯一ID。

      因此,对于给定的情况,需要使用一些服务器/客户端代码进行迭代以将数据保存在 firebase 中。

      伪代码:

      For each array 
         curl -X POST -d 
             "user_id": "jack",
             "text": "Ahoy!" 
          'https://my-firebase.firebaseio.com/posts.json'
      Next
      

      【讨论】:

        猜你喜欢
        • 2013-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        相关资源
        最近更新 更多