質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

4743閲覧

Realtime Database の接続切断

退会済みユーザー

退会済みユーザー

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2017/02/02 01:30

編集2017/02/04 09:10

Firebase でチャットアプリを試験的に作成しています。

無料枠には、接続数の制限があるので、一定時間動きがなければ切断したいと考えているのですが、意図した動作をしません。

ちょっとかっこ悪いソースですが、抜粋したものを晒します。

JavaScript

1var firebase_task = []; 2 3$(document).ready(function () { 4 firebase.initializeApp(config); 5 var baseRef = firebase.database().ref('HOGE'); 6 firebase_task[0] = baseRef.on('child_added', function (data) { 7 console.log(data.key, data.val()); 8 }); 9 firebase_task[1] = baseRef.on('child_removed', function (data) { 10 console.log(data.key, data.val()); 11 }); 12 firebase_task[2] = baseRef.on('child_changed', function (data) { 13 console.log(data.key, data.val()); 14 }); 15}); 16 17function disconnect() { 18 var baseRef = firebase.database().ref('HOGE'); 19 baseRef.off('child_added', firebase_task[0]); 20 baseRef.off('child_removed', firebase_task[1]); 21 baseRef.off('child_changed', firebase_task[2]); 22 } 23}); 24

.off() を適当なタイミングで呼んでやると切れると思っていたのですが、開発ツールで WS の通信状況を見ると、接続が残っているようです。管理画面の接続数でもカウントされているので、Simultaneous connections に数えられている認識です。こちらをカウントから外すにはどのように切ればよいでしょうか?

ご存じの方、ご教示いただけると幸いです。

kanemotos👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

【Interface: Database  |  Firebase】
https://firebase.google.com/docs/reference/js/firebase.database.Database?hl=ja

JavaScript

1firebase.database().goOffline();

これとか?

投稿2017/02/04 09:17

編集2017/02/04 09:18
kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/04 09:33

これは、発想の転換ですね! ドキュメントは見ていたのですが、ちょっと使用用途が違っているように思えたので試してませんでした。 今、挙動を見る限り、うまく行っているように見えます。 もう少し検証してみます。 ありがとうございます。
kei344

2017/02/04 09:44

> 使用用途 (リンク先)> The client automatically maintains a persistent connection to the Database server, which will remain active indefinitely and reconnect when disconnected. However, the goOffline() and goOnline() methods may be used to control the client connection in cases where a persistent connection is undesirable. (Google翻訳)>クライアントはデータベースサーバーへの永続的な接続を自動的に維持します。データベースサーバーは無期限にアクティブのままで、切断されたときに再接続します。 ただし、永続的な接続が望ましくない場合に、goOffline()およびgoOnline()メソッドを使用してクライアント接続を制御できます。 上記部分を読むと、「接続し続ける仕様」のように読めます。全てのイベントを外しても明示的に切断しない限り接続し続けるのでは。
退会済みユーザー

退会済みユーザー

2017/02/04 09:51

そのようです。英語のまま見ていたので、中途半端に理解していました。 (ローカル作業をキューに貯めるモードへの移行と認識していました) 接続数のカウントを確認していますが、通信を見る限り成功しているように思います。 後は時間が経ったら確認完了なので、もう少し様子を見てみます。 大変助かりました。
退会済みユーザー

退会済みユーザー

2017/02/04 10:11

意図した動作が確認できました。少し諦め気味だったので大変助かりました。
guest

0

わたしはFirebaseをiOSでメインで使っており、JavaScriptの方は使い込んでいるわけではないのですが、回答させていただきます。

https://firebase.google.com/docs/database/web/retrieve-data#detach_listeners

こちらのドキュメントの「リスナーのデタッチ」では、『.off()には引数無しで渡す』と書いてありますので、そちらの方法で試してはいかがでしょうか?

iOS版からの想像になってしまいますが、「firebase_task[0]」的なものは引数で渡さずとも、'HOGE'に関連する接続は全て削除される挙動になると思います。

投稿2017/02/04 07:24

編集2017/02/04 07:26
kanemotos

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/02/04 09:09

アドバイス、ありがとうございます! baseRef.off(); で試してみたのですが、やはり、開発ツールで見る限り接続が残ってしまいます。 https://firebase.google.com/docs/reference/js/firebase.database.Query#off > If a callback is not specified, all callbacks for the specified eventType will be removed. Similarly, if no eventType or callback is specified, all callbacks for the Reference will be removed. とあるので、 baseRef.off('child_added'); baseRef.off('child_removed'); baseRef.off('child_changed'); こちらも試したのですが、やはり残ってしまいます。 iOS版では、接続は任意のタイミングでうまく切断することができるということですよね?それがわかっただけでも、非常にありがたいです。 学習中なもので、なにか前提条件を見落としている気がします。些細な点でも気がついた点があれば、ご指摘いただけると幸いです。。。
退会済みユーザー

退会済みユーザー

2017/02/04 09:35

detach で検索かけると、 baseRef.off(); で行けそうなんですけど、私の環境では、意図した動作になっていないです。 もう少し悩んでみます。 detach をキーワードに検索をしていなかったので助かりました。
kanemotos

2017/02/04 09:38

英語サイトだと.offに引数を渡すサンプルがありますね。失礼しました。 Databaseの'HOGE'監視を削除しても、'HOGE'の子供を監視するものまでは削除されない仕様だとは、書いてありますが、そこの所は見落とされてないんじゃないかなとは思います。 iOS版ではうまく切断できる実装が出来ましたが、わたしは接続が残るかどうかという確認までは行いませんでした。 .onメソッドに相当する部分にログを吐くようにして、.offするとログが出なくなったことを以て確認しました。 開発ツールで確認されていると聞いて、もしかしたらhttpセッションレベルでは次も使いまわせるように一定時間のあいだ接続が残るような仕様になっていたりするのではないかとの推測が頭をよぎりました。 試験実装であればそこまで神経質に気にする必要はないのかななんて思います。 本番運用するようになって100を超えるようであれば、何のサービスなのかによるとは思いますが25$/monthですし、嬉しい悲鳴と思ってお金を払うくらいの気持ちで良いんじゃないかと思います。私はそういう心持ちで使っています。
退会済みユーザー

退会済みユーザー

2017/02/04 09:57

kei344 さんが指摘してくれていますが、なんらかのセッションレベルで残ってる可能性が高そうです。 > 本番運用するようになって100を超えるようであれば、何のサービスなのかによるとは思いますが25$/monthですし、嬉しい悲鳴と思ってお金を払うくらいの気持ちで良いんじゃないかと思います。 そうですね^^仕様上の確認がしたかったという面が強いので、多分アップグレードはすると思います。 アドバイス、ありがとうございます。
kanemotos

2017/02/04 10:46

うまく解決できたようで良かったです。 たぶん.offはcallbackを止めるだけの仕様で、接続面では何がしかが残っているようですね。 私も接続が切れるものだと思っていたので勉強になりました!!
退会済みユーザー

退会済みユーザー

2017/02/04 10:52

> たぶん.offはcallbackを止めるだけの仕様で、接続面では何がしかが残っているようですね。 ですね。個人的には切れよ!って感じですが、何か意図があるのだと思います。 貴重な情報の共有、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問