SlideShare a Scribd company logo
JavaScriptから利用する
Firebase
@shimokawa
2016/03/08
下川拓治
@shimokawa
福岡 → 京都 → 東京
最近はWebアプリ開発が多い
Ruby, JavaScript, Java, C/C++
目次
• データの読み書き
• ホスティング
• ユーザ認証
• オフライン対応
• 実際に使ってみての感想など
データの読み書き
使用準備
<script src='https://cdn.firebase.com/js/client/2.4.1/firebase.js'></script>
クライアントライブラリをインクルード
Firebaseのデータは1つのJSONオブジェクト
{
"messages" : {
"-KBmsNUshgxhTjcjFi-7" : {
"name" : "shimo",
"text" : "こんにちは"
},
"-KBmsPV_vfbOfsRKNqQr" : {
"name" : "shimo",
"text" : "こんばんは"
}
}
}
データベースの参照の取得
// JSONオブジェクトのルートの参照
var rootRef = new Firebase(“https://<YOUR-APP-ID>.firebaseio.com/“);
// ルートの直下にあるmessagesキー参照
var messageRef = rootRef.child("messages");
// ルートの直下にあるmessagesキー参照
var messagesRef = new Firebase(“https://<YOUR-APP-ID>.firebaseio.com/messages");
参照は、JSONツリー上の特定の場所を指し示すもの
データの読み書きするにはまず参照を取得する
データの保存方法
• 参照オブジェクトのメソッドを使う
• set()
• update()
• push()
• transaction()
set()
• 基本的な保存方法
• 参照が示すキーに対する値全体を上書きする
• 参照が示すキーが存在しない場合はキーごと作成する
{
"users" : {
"taro" : {
"name" : "Taro",
"age" : 30
}
}
}
var userRef = new Firebase(“https://<YOUR-APP-ID>.firebaseio.com/users/taro");
userRef.set({name: "Taro", age: 30});
保存後のデータベースの内容
push()
• 参照する場所の直下に一意なキーを生成した上で、
そのキーに対して値を保存する
• キーはタイムスタンプから作られるので、時間順になる
• 参照が示す場所にリストデータを保存するのに使う
var messagesRef = new Firebase("https://<YOUR-APP-ID>.firebaseio.com/messages");
messagesRef.push({name: "Taro", text: “Goodbye"});
{
"messages" : {
"-KBmsNUshgxhTjcjFi-7" : {
"name" : "Taro",
"text" : "Hello"
},
"-KBmsPV_vfbOfsRKNqQr" : {
"name" : "Taro",
"text" : "Goodbye"
}
}
}
更新後のデータベースの状態
自動生成される
データの読み出し方法
• 参照にコールバック関数を登録する
• on(“イベント種別”, callback)
• once(“イベント種別”, callback)
• イベントの種類
• value
• child_added
• child_changed
• child_removed
• child_moved
on(“value”, callback)
• 参照が示す場所以下の値をまるごと取得する
• その後、参照先のデータが更新されるたびに
繰り返しコールバック関数に更新後のデータが渡される
{
"messages" : {
"-KBmsNUshgxhTjcjFi-7" : {
"name" : "Taro",
"text" : "Hello"
},
"-KBmsPV_vfbOfsRKNqQr" : {
"name" : "Taro",
"text" : "Goodbye"
}
}
}
var ref = new Firebase("https://<YOUR-APP-ID>.firebaseio.com/messages");
ref.on("value", function(snapshot) {
console.log(snapshot.val());
});
データベースの内容
snapshot.val()
コールバックに渡されるのはDataSnapshot型のオブジェクト
https://www.firebase.com/docs/web/api/datasnapshot/
on(“child_added”, callback)
• 参照の子ノードを一つずつ順番に取得する
• 典型的には、push()で作られたリストを指し示す参照から、
そのリストの項目を順に取得する
• 既存のデータがある場合は、一通りデータを読み出す
• その後、子ノードが追加されるたびに、コールバックが
呼ばれる
var ref = new Firebase("https://<YOUR-APP-ID>.firebaseio.com/messages");
ref.on(“child_added", function(snapshot) {
console.log(snapshot.val());
});
データベースの内容
{
"messages" : {
"-KBmsNUshgxhTjcjFi-7" : {
"name" : "Taro",
"text" : "Hello"
},
"-KBmsPV_vfbOfsRKNqQr" : {
"name" : "Taro",
"text" : "Goodbye"
}
}
}
snapshot.val()
その他のイベント
• on(“child_changed”, callback)
• 参照の子ノードの値が変化した時にコールバックが呼ばれる
• on(“child_removed”, callback)
• 参照の子ノードが削除された時にコールバックが呼ばれる
• on(“child_moved”, callback)
• リストデータ内での子ノードの位置が変化したら呼ばれる
• リスト内での順序が変わるのはpriorityが変化した時
サンプル:チャットのようなもの
https://wiiu.firebaseapp.com/toy_chat.html
リストデータ取得時の条件追加
• 並び順の指定
• orderByChild()
• orderByKey()
• orderByValue()
• orderByPriority()
• 取得件数の制限
• limitToFirst()
• limitToLast()
• 範囲の指定
• startAt()
• endAt()
• equalTo()
ref.orderByPriority()
.startAt(100)
.limitToFirst(20)
.once('value', function(snapshot) {
console.log(snapshot.val());
});
使用例
サンプル:
https://wiiu.firebaseapp.com/pagination.html
過去のメッセージを少しずつ取得するよう修正したもの
ホスティング
ホスティング
• HTMLファイルをFirebaseのサーバに置いて公開できる
• https://{アプリケーションID}.firebaseapp.com
• 有料で独自ドメインにできる
先ほどのサンプルもこれを使っています
ホスティング: 手順
$ npm install -g firebase-tools
$ firebase init
$ firebase deploy
コマンドラインツールをインストールする
プロジェクトのディレクトリを初期化する
使用するFirebaseアプリケーションを選択する
初回実行時には先にログインするよう求められる
プロジェクトを公開する
https://{アプリケーションID}.firebaseapp.com に公開される
firebaseコマンドが使えるようになる
設定ファイル firebase.json と、HTMLファイル等を置くディレクトリが作成される
ユーザー認証
セキュリティに関するトピック
• ユーザ認証
• Eメール&パスワード
• OAuth (Facebook, Twitter, GitHub, Google)
• 匿名
• カスタム
• アクセス権限の設定
• 入力データの検証
使用準備
Login & Auth ページの Email & Passwordにある
Enable Email & Password Authentication にチェックを入れる
認証機能を使ったサンプル
https://wiiu.firebaseapp.com/auth_required.html
画面構成と使用するAPI
• ユーザ登録画面
• createUser() を使ってユーザを作成
• ログイン画面
• authWithPassword() を使ってログイン処理
• 認証が必要な画面
• getAuth() を使ってログイン中か否かをチェック
その他のユーザー認証関連API
unauth() ログアウト
changeEmail() メールアドレス変更
changePassword() パスワード変更
resetPassword() パスワードのリセット
removeUser() ユーザーの削除
オフライン対応
var ref = new Firebase(‘https://<YOUR-APP-ID>.firebaseio.com/.info/connected');
ref.on("value", function(snap) {
if (snap.val() === true) {
console.log("online");
} else {
console.log("offline");
}
});
• 自分のオンライン状態を変化を検知
var lastOnlineRef = new Firebase("users/taro/lastOnline");
lastOnlineRef.onDisconnect().set(Firebase.ServerValue.TIMESTAMP);
• 接続が切れた時に値を更新
• オフライン中にもデータの保存ができて、オンライン
復帰時にサーバと同期
実際に使ってみて
• 使いはじめの頃はRDBと比較してしまう
• 逆順にソートできないの? とか
• 制約はあるが、使ってみるとわりと何とかなる
• データの蓄積よりリアルタイム性のある情報のやり取り向き
• ユーザー認証やオフライン対応の機能はWebアプリを
作る上でとても便利
リンク
• 今回のサンプルアプリ
• https://wiiu.firebaseapp.com
• サンプルアプリのソース
• https://github.com/takuji/firebase_demo
終
おまけ
APIがPromise化
https://www.firebase.com/blog/2016-01-21-keeping-our-promises.html
APIのレスポンスはもっぱらコールバック関数で受け取っていたのが
、
一部のAPIの戻り値がPromiseになった。
小技:自動生成されるキーをデータに入れる
空push()してset()
var messagesRef = new Firebase("https://<YOUR-APP-ID>.firebaseio.com/messages");
var messageRef = messagesRef.push();
messageRef.set({id: messageRef.key(), name: "Taro", text: “Goodbye"});
{
"messages" : {
"-KBmsNUshgxhTjcjFi-7" : {
"id" : "-KBmsNUshgxhTjcjFi-7",
"name" : "Taro",
"text" : "Hello"
}
}
}
更新後のデータベースの状態

More Related Content

PDF
AngularFireで楽々バックエンド
PDF
今からでも大丈夫!Firebase入門
PDF
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
PDF
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
PDF
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
PDF
Elasticsearch Authプラグインでアクセスコントロール
PDF
Elasticsearch at Makuake
PDF
ElasticSearch勉強会 第6回
AngularFireで楽々バックエンド
今からでも大丈夫!Firebase入門
ElasticSearch+Kibanaでログデータの検索と視覚化を実現するテクニックと運用ノウハウ
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Elastic Stackの紹介とOpenStackでの活用事例(Searchlightなど) - OpenStack最新情報セミナー 2016年5月
Elasticsearch Authプラグインでアクセスコントロール
Elasticsearch at Makuake
ElasticSearch勉強会 第6回

What's hot (18)

PDF
データマイニング+WEB勉強会資料第6回
PPTX
EmbulkとDigdagとデータ分析基盤と
PDF
ログ管理のベストプラクティス
PDF
Fess/Elasticsearchを使った業務で使える?全文検索への道
PPTX
Spring data-rest-and-spring-cloud-contract
PPTX
Fluentd+elasticsearch+kibana(fluentd編)
PDF
20120405 setsunaセミナー
PDF
fluentd を利用した大規模ウェブサービスのロギング
PDF
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
PDF
Embulkを活用したログ管理システム
PDF
20181031 springfest spring data geode
PDF
CAジャーナルクラブ Dremel: Interactive Analysis of Web-Scale Datasets
PDF
DBFlute Mavenプラグインを用いてCRUD作成
PDF
爆速クエリエンジン”Presto”を使いたくなる話
PDF
EmbulkのGCS/BigQuery周りのプラグインについて
PDF
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
PPTX
Introduction to DocumentDB
PPT
Mongodb
データマイニング+WEB勉強会資料第6回
EmbulkとDigdagとデータ分析基盤と
ログ管理のベストプラクティス
Fess/Elasticsearchを使った業務で使える?全文検索への道
Spring data-rest-and-spring-cloud-contract
Fluentd+elasticsearch+kibana(fluentd編)
20120405 setsunaセミナー
fluentd を利用した大規模ウェブサービスのロギング
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
Embulkを活用したログ管理システム
20181031 springfest spring data geode
CAジャーナルクラブ Dremel: Interactive Analysis of Web-Scale Datasets
DBFlute Mavenプラグインを用いてCRUD作成
爆速クエリエンジン”Presto”を使いたくなる話
EmbulkのGCS/BigQuery周りのプラグインについて
ISUCONの勝ち方 YAPC::Asia Tokyo 2015
Introduction to DocumentDB
Mongodb
Ad

Viewers also liked (20)

PDF
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付き
PDF
Laravel の学び方と得られる学び
PDF
Laravel / Lumen 次の一歩
PPTX
Laravelを使ってみた
PDF
デザインにもこだわったUiの事始め3
PDF
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
PPTX
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
PDF
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
PDF
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
PPTX
Phpフレームワーク 「laravel」でブログを作ろう
PDF
3 tips of Laravel
PPTX
アプリチームを支えるSlack bot
PDF
ビルドサーバで使うDocker
PPTX
Laravelチュートリアルを作ってみた。
PDF
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
PDF
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
PDF
わかってるフレームワーク Laravel
PDF
カスタムトランジションやジェスチャーを生かしたUIの実装ポイント
PPTX
20151205フルスクラッチcms作成のノウハウ With Laravel
PPTX
Laravel LT
デザイナーがXcodeを使って 開発効率をUPさせた 5つのエピソード + 現場エンジニアのコメント付き
Laravel の学び方と得られる学び
Laravel / Lumen 次の一歩
Laravelを使ってみた
デザインにもこだわったUiの事始め3
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
[Laravel] CRUDアプリから一歩踏み出す3つのアプローチ
PHPでPostgreSQLとPGroongaを使って高速日本語全文検索!
Firebaseでのファイルアップロード処理と便利ライブラリの紹介
Phpフレームワーク 「laravel」でブログを作ろう
3 tips of Laravel
アプリチームを支えるSlack bot
ビルドサーバで使うDocker
Laravelチュートリアルを作ってみた。
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
わかってるフレームワーク Laravel
カスタムトランジションやジェスチャーを生かしたUIの実装ポイント
20151205フルスクラッチcms作成のノウハウ With Laravel
Laravel LT
Ad

Similar to JavaScriptから利用するFirebase (20)

PPTX
Firebase hands on in Matsuyama
PDF
Vue.js + firebase 実案件で使ってみた
PDF
GDG DevFest Kobe Firebaseハンズオン勉強会
PPTX
FirebaseではじめるサーバレスSPA開発
PDF
Firebase analytics for_android _ i_os
PDF
知っておきたいFirebase の色んな上限について
PDF
Firestoreを勉強してみた
PPTX
ログインの全て
PDF
Firebase hands on_#1
PDF
Nodejsによるapiサーバ構築事例
PDF
Firebase によるリアルタイム モバイル開発 @gcpug 福岡
PDF
Firebase Extensions はじめの一歩
PDF
Firebase初心者がwebチャットアプリを作ってみた
PDF
Firebase Realtime Database を C# から利用する
PDF
GitHub APIとfreshで遊ぼう
PDF
Firebaseを使ってアプリを作ってみた
PDF
PDF
Node.jsでブラウザメッセンジャー
PDF
Building a Flutter Development Environment with VSCode and Useful Extensions
PDF
汎用apiサーバの構築
Firebase hands on in Matsuyama
Vue.js + firebase 実案件で使ってみた
GDG DevFest Kobe Firebaseハンズオン勉強会
FirebaseではじめるサーバレスSPA開発
Firebase analytics for_android _ i_os
知っておきたいFirebase の色んな上限について
Firestoreを勉強してみた
ログインの全て
Firebase hands on_#1
Nodejsによるapiサーバ構築事例
Firebase によるリアルタイム モバイル開発 @gcpug 福岡
Firebase Extensions はじめの一歩
Firebase初心者がwebチャットアプリを作ってみた
Firebase Realtime Database を C# から利用する
GitHub APIとfreshで遊ぼう
Firebaseを使ってアプリを作ってみた
Node.jsでブラウザメッセンジャー
Building a Flutter Development Environment with VSCode and Useful Extensions
汎用apiサーバの構築

JavaScriptから利用するFirebase

Editor's Notes

  • #2: JavaScriptから利用するFirebaseというタイトルで、お話させていただきます。
  • #3: 私は下川拓治と申します。 株式会社マナボで開発の仕事をしています。 主にRailsアプリの開発をしていまして、その他にJavaやGoのサーバのお世話をしています。
  • #4: 今回の話の内容はこのようになっています。 はじめにFirebaseに対してJavaScriptでデータの読み書きをする方法について説明します。 次に、Firebaseを使ったWebアプリをホスティングする機能が提供されているので、その手順を説明します。 そのあと、セキュリティ関連トピックのうち、特にJavaScriptを使う部分としてユーザ認証周りについて話をします。 最後に、日頃Railsアプリを開発している人間が初めてFirebaseを使ってみて感じた事などを少しお話ししたいと思います。
  • #6: Webページからfirebaseを使うには、まずクライアントライブラリをインクルードします。
  • #7: 次に、Firebaseに保存されるデータがどういうものなのかを説明します。 Firebaseに保存されるデータは、一つの大きなJSONオブジェクトです。
  • #8: データを操作するにはまずJSONオブジェクト場所を表す参照を取得します。 ルート直下のmessagesキーの参照は、ルートの参照のchild()メソッドを使ってこのように書けます。 URLで直接messagesへの参照を取得することも可能です。
  • #9: データの保存に関する操作にはこれらの4つがあります。
  • #10: set()は一番基本的な保存方法です。 参照が指し示す場所を引数に与えられた値で上書きします。
  • #11: コード例です。 ユーザーの情報をセットしています。
  • #12: pushは参照直下に値を保存するのではなく、一意なキーを生成して、参照直下にはそのキーが入り、その下に値が保存されます。 キーはタイムスタンプから作られ、pushするたびに
  • #13: コード例です。 リストデータと言っても、構造的にはオブジェクトで、キーが時系列になっているというだけです。
  • #14: 値を取得するにはonメソッドを使ってコールバックを登録します。 onceメソッドはそのonメソッドの特殊版になります。 イベントの種類にはこの5つがあります。 参照が指す場所の何を知りたいのかによって使い分けます。
  • #15: まずon()メソッドにvalueイベントを指定するデータの取り方を説明します。
  • #16: コード例です。 ここではmessagesキーというリストデータをまるごと読み取ろうとしています。 最初に一度データを取得した後、新しいメッセージが追加されても、既存のメッセージの文面が更新されても、コールバックが呼び出されます。
  • #17: 次はchild_addedイベントです。 valueとの違いは、子ノードを一つずつに分けて個別にコールバックを呼び出すところです。
  • #20: (実演はしない)
  • #21: チャットメッセージ一覧のようなリストデータを取得したい時に、並び順を変えたり、取得する件数を絞ったり、条件を満たすものだけを取得するようにもできます。 コールバックを設置する前に
  • #23: 10:00
  • #26: 11:00
  • #39: push()を使うと、キーが自動的に生成されますが、値の方にIDとしてこの値を含めておくと、後でデータを削除したい時にIDの取得が簡単になって便利です。 それにはまず引数なしでpush()を実行し、キーの生成だけを済ませます。 そしてそのキーの値を、セットするオブジェクトのidキーとして含めることができます。