Firebase …使用node.js脚本添加/更新Firebase

我有任意的JSON,这是明智的布局如下:

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

我已经写了一个node.js脚本来certificate这个概念(为什么我使用的是JS API似乎比REST或者Ruby更好,我可能是错的):

 http = require('http') Firebase = require('firebase') all_sites_url = "http://supercharge.info/service/supercharge/allSites" firebase_url = "https://tesla-supercharger.firebaseio.com/" http.get(all_sites_url, (res) -> body = "" res.on "data", (chunk) -> body += chunk return res.on "end", -> response = JSON.parse(body) all_sites = response send_to_firebase(response) return return ).on "error", (e) -> console.log "Got error: ", e return send_to_firebase = (response) -> firebase_ref = new Firebase(firebase_url) for charger in response console.log charger new_child = firebase_ref.push() new_child.set {id: charger.id, data: charger}, (error) -> if error console.log "Data cound not be saved #{error}" else console.log "Data saved successfully" 

结果是由Firebase生成的唯一ID,该ID具有作为孩子的dataid子项。 data孩子有预期的信息,如namestatus

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

 - 100 - name - address street city 

所以我的第一个问题是如何做到这一点,如果它是明智的。

第一次后,这个数据(称为外部服务器的数据)将在那里,移动应用程序将添加一些字段。 这些数据已经不存在了。 下一次,我从外部服务器获取数据,我想更新那些服务器知道的东西,比如状态。 我不想篡改只有移动设备才会知道的事情,比如remote_observations

我知道我在这里看起来有点密集,但是我试图把一个合理的数据模型放在一起,这个数据模型可以使用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 

所以我解决的代码是这样的:

 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 

讨论:

这个想法是有一个像这样的Firebase结构:

 - 100 - address street: "123 Main Street" 

等等

这就是为什么id被拉高为主键的原因之一。 原因2是我可以唯一标识从外部服务器拉出的一个对象,并将其作为我的Firebase中的“相同”对象,并应用所需的任何更新。

主显节1:更新更像是upsert。 如果密钥在那里,那么你提供的任何哈希replace匹配的值。 如果不在那里,那么Firebase很高兴地添加它。 这是很酷的,因为它涵盖了推送和修补案例。

主显节2:如果没有任何东西告诉它停止,这个过程将挂起等待事件。 这就是为什么倒数索引, length减less,直到代码插入(因缺乏更好的术语)每个项目。

观察1:与使用Python或Ruby的REST相比,在node.js中执行此操作的速度非常快。 如果我正确地理解这个东西,那么这个东西真是太酷了。

观察2:关于编写节点shell脚本来做这种事情,在写这篇文章的时候没有太多的智慧。 也许这是一个好主意,也许是一个坏主意。 我不知道。

观察3:由于节点和Firebase Javascript API(都是好东西)的asynchronous特性,在最后一步完成之前终止一个进程可能会非常棘手,因为您的进程必须持续足够长的时间才能完成最后的请求/响应与Firebase。 如前所述,这是在update的完成处理程序中完成的。 否则,当stream程退出时,我们不一定会完成。

注意事项1:与观察2相关,这可能是一个坏主意,但我一直没能find解决问题的资源。

注意事项2:这可能是一个可怕的滥用或误解的Firebase更新API。 我正在报告在我的具体数据有限的情况下观察到的行为。 因人而异。

注意事项3:我希望过程的一生如我所build议的观察3一样。

无咖啡因的注意事项:JavaScript的这一点是非常不同的,它不应该太难翻译。 或者转到js2coffee并将Coffeescript粘贴到右侧窗格中,以便在左侧窗格中调出真正的Javascript。