通过REST API将阵列推送到Firebase

时间:2016-01-20 08:45:24

标签: api rest firebase firebase-realtime-database

问题

  

如何(使用单个HTTP请求 REST API )向Firebase写入数组并为每个数组元素提供一个(非整数)唯一ID

As described here

<小时/>

数据

我必须写的数据如下所示。

数据到write.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请求中执行此操作,所以我希望避免迭代数组中的每个元素,而是希望在单个请求中推送批处理。

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

pseudocode.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'

然而,当我这样做时,我得到了我上面描述的我不想要的东西(即顺序整数键)。

我想避免做这样的事情:

抗pseudocode.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'
}

有可能完成我所描述的内容吗?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:1)

我认为有一种方法可以使用Firebase API来执行此操作,如OP中所述。

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

  1. 遍历每个数组元素。
  2. 为每个元素分配一个唯一的ID(由服务器脚本生成)。
  3. 创建一个返回对象,其中键是唯一的ID,值是相应的数组元素。
  4. 使用patch方法通过单个HTTP请求将对象写入Firebase。因为post为整个对象本身创建了一个新的Firebase生成的ID。鉴于,patch没有;它直接写入父节点。
  5. 的script.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'
    

答案 1 :(得分:0)

仅当您使用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

答案 2 :(得分:0)

您决定使用POST是正确的。导致数字索引作为键的那个是因为您的有效负载是一个数组。无论何时发布/ put和数组,键都将始终为索引。如果您希望服务器为您生成密钥,请逐个发布您的对象。