Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
火基。。。使用node.js脚本添加/更新Firebase_Node.js_Coffeescript_Firebase - Fatal编程技术网

火基。。。使用node.js脚本添加/更新Firebase

火基。。。使用node.js脚本添加/更新Firebase,node.js,coffeescript,firebase,Node.js,Coffeescript,Firebase,我有一个任意的JSON,它的布局很合理,如下所示: [ { "id":100, "name":"Buckeye, AZ", "status":"OPEN", "address":{ "street":"416 S Watson RD", "city":"Buckeye" ... } } ] - 100 - address street: "123 Main Street" 我已经编写了一个node

我有一个任意的JSON,它的布局很合理,如下所示:

[
  {
    "id":100,
    "name":"Buckeye, AZ",
    "status":"OPEN",
    "address":{
      "street":"416 S Watson RD",
      "city":"Buckeye"
      ...
    }
  }
]
- 100
  - address
    street: "123 Main Street"
我已经编写了一个node.js脚本来证明概念(我之所以使用node,是因为在这方面JSAPI似乎比REST或Ruby更受支持。我可能错了):

结果是Firebase生成了一个唯一的id,它的子项是
数据
id
子项。
数据
子项具有预期的信息,如
名称
状态

我更喜欢生成一个键值对。例如,对于
id
100:

- 100
    - name
    - address
      street
      city
所以我的第一个问题是如何实现这一点,或者它是否合理

在第一次访问之后,这些数据(称之为来自外部服务器的数据)将存在,并且移动应用程序将添加一些字段。这些都不存在于已有的数据中。下次从外部服务器获取数据时,我想更新服务器可能知道的已更改的内容,如状态。我不想篡改只有移动设备才会知道的东西,比如
远程观察

我知道我在这里看起来有点密集,但我正在尝试建立一个合理的数据模型,该模型将使用CRON作业从该服务器进行更新,并从一堆移动设备进行增量更新

非常感谢您的帮助

更新:我发现这可以获得我想要的结构:

send_to_firebase = (response) ->
  firebase_ref = new Firebase(firebase_url)

  for charger in response
    firebase_ref.child(charger.id).update charger, (error) ->
      if error
        console.log "Data could not be saved #{error}"
      else
        responses_pending += 1
        console.log "Data saved successfully : #{responses_pending} pending"
        firebase_ref.on 'value', ->
          console.log "value received rp=#{responses_pending}"
          process.exit() if (responses_pending -= 1) < 1
send\u to\u firebase=(响应)->
firebase\u ref=新firebase(firebase\u url)
用于响应的充电器
firebase\u参考子项(充电器id)。更新充电器(错误)->
如果错误
console.log“无法保存数据#{error}”
其他的
响应\u待定+=1
console.log“成功保存数据:#{responses_pending}pending”
firebase_参考“值”,->
console.log“收到的值rp=#{responses_pending}”
如果(responses_pending-=1)<1,则process.exit()

所以我确定的代码是:

http = require('http')
Firebase = require('firebase')

firebase_url = '/path/to/your/firebase'

# code to get JSON of the form:
{
  "id":100,
  "name":"Buckeye, AZ",
  "status":"OPEN",
  "address":{"street":"416 S Watson RD",
            "city":"Buckeye",
            "state":"AZ",
            "zip":"85326",
            "country":"USA"},
   ... etc.
}

# Asynchronous get of JSON hash from some server or other.
get_my_fine_JSON().on 'complete', (response) ->
  send_to_firebase(response)

send_to_firebase = (response) ->
  firebase_ref = new Firebase(firebase_url)

  length = response.length

  for charger in response
    firebase_ref.child(charger.id).update charger, (error) ->
      if error
        console.log "Data could not be saved #{error}"
      else
        console.log "Data saved successfully"

      process.exit() if length -= 1 is 0
讨论:

这个想法是要有这样一个火基结构:

[
  {
    "id":100,
    "name":"Buckeye, AZ",
    "status":"OPEN",
    "address":{
      "street":"416 S Watson RD",
      "city":"Buckeye"
      ...
    }
  }
]
- 100
  - address
    street: "123 Main Street"
等等

这就是为什么
id
被拉起成为主键的原因1。原因2是,我可以唯一地将从外部服务器上拉下来的对象标识为Firebase中的“相同”对象,并应用任何必要的更新

顿悟1:更新更像是升级。如果键在那里,那么您提供的任何散列都将替换匹配的值。如果它不在那里,那么Firebase很高兴地添加了它。这很酷,因为它涵盖了推送和修补两种情况

顿悟2:如果没有任何东西告诉它停止,这个过程将挂起等待事件。这就是倒计时索引
length
递减的原因,直到每个项目的代码都上升(因为缺少更好的术语)

观察1:与使用Python或Ruby的REST相比,在node.js中执行此操作速度非常快。如果我没弄错的话,这东西真是太酷了

观察2:在撰写本文时,关于编写节点shell脚本来完成这类工作,还没有太多的智慧。也许这是个好主意,也许是个坏主意。我不知道

观察3:由于node和Firebase Javascript API的异步特性(两者都是好东西),在最后一位完成之前终止进程可能很棘手,因为您的进程必须等待足够长的时间才能使用Firebase完成最后一个请求/响应。如前所述,这是在
更新的完成处理程序中完成的。否则,当流程退出时,我们不一定完成

警告1:与观察2相关,这可能是个坏主意,但我还没有找到解决这个问题的资源

警告2:这可能是对Firebase更新API的可怕滥用或误解。我报告在我的特定数据有限的情况下观察到的行为。YMMV

警告3:我希望过程寿命与我在观察3中建议的一样


给脱咖啡因的人一个提示:这方面的Javascript差别非常小,翻译起来应该不会太难。或者转到并将Coffeescript粘贴到右侧窗格中,以在左侧窗格中获得可调整的真实Javascript。

嗨,Steve,因为您的源数据有自己的ID系统,因此最好调用
child
而不是像您发现的那样,调用
push
。如果这确实是您所寻找的,您能否将您的更新转化为可接受的答案?第二个问题取决于您是否能够以某种补丁格式从服务器获取修改/添加的数据。如果可以将数据转换为仅包含ID和更改的格式,则可以使用Firebase的
update
功能仅发送添加/修改的属性。如果这给你带来了问题,我建议你为这一点单独开一个问题。是的,只要我弄清楚第二部分,即更新。这是一个奇怪的用例,因为我每天更新Firebase一次,并且可能添加、更新或两者都不更新(当没有任何更改时)。但是是的,一旦我弄明白了,我会的!我认为更新现有数据结构的愿望比您想象的更为普遍。我最近看到一些这样的问题。作为一个附带问题:你使用的是coffeescript吗?这是coffeescript。我是一个红宝石爱好者,更喜欢摆脱Javascript的语法醋。回到你原来的观点。对我相信你是对的,要想出一个通用的配方是一个挑战。至少对我来说是这样。