火基。。。使用node.js脚本添加/更新Firebase
我有一个任意的JSON,它的布局很合理,如下所示:火基。。。使用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
[
{
"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的语法醋。回到你原来的观点。对我相信你是对的,要想出一个通用的配方是一个挑战。至少对我来说是这样。