1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

firebaseでカウントアップさせる方法

Last updated at Posted at 2022-02-27

firebaseでボタン押したらカウントアップするのを作っていたのだけど、realtimedatabaseを使う場合に
書き込みができるようになってるのは、避けた方が良さそうで、書き込みの権限をオープンにするのも問題があるので、まずルールを

qiita.rules
{
  "rules": {
    ".read": true,".write": false
  }
}

これで書き込めなくなった。
取得方法はいくつもあるので割愛を

書き込み方法はfirebaseのfunctionsを利用しようと思う。

qiita.js
const helloWorld = httpsCallable(functions, 'hello');
helloWorld();

こんな感じにhelloという関数を呼びたいとする。
(functions自体、データベースのアクセスをキーにできたりもするけど、今回は普通に通信を使う。)

qiita.js
exports.hello = functions.https.onRequest((request, response) => {
	response.set('Access-Control-Allow-Origin', '*');
    const postsRef = admin.database().ref('count/no01');
    postsRef.set(admin.database.ServerValue.increment(1));
});

こんな感じで登録するのだけど、動かない。みたいな事がある。
その場合は、上部に

qiita.js
const functions = require("firebase-functions");
const admin = require('firebase-admin')
admin.initializeApp()

を記載すると、動作する。
ServerValue.increment
が便利だけど、簡単なカウントアップ用のデータベースが完成した。

====追記

ここまでやって、連続で実行をすると、タイムアウトが発生する。しかも完了まで、結構時間がかかる。

onRequestで返し値を送らないといけないみたいだが、送らなくても勝手に返してくれてる時もあって、結構不便だった。

qiita.js
const param = request.query.param;
res.status(200).send(param)

この戻り値で200を送ると、タイムアウトしないで、追える。

qiita.js
exports.hello = functions.https.onRequest((request, response) => {
	response.set('Access-Control-Allow-Origin', '*');
    const postsRef = admin.database().ref('count/no01');
    postsRef.set(admin.database.ServerValue.increment(1));
    const param = request.query.param;
    res.status(200).send(param)
});

これで、今まで、数百ミリ秒処理が終わるのにかかっていたのが治った。10ミリ秒もなく処理が終わる

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?