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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

Q&A

解決済

1回答

2110閲覧

firebaseでruntransaction実行時に複数のdocを取得したい

kazamidori2140

総合スコア9

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Firebase

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

Vue CLI

Vue CLIは、Vue.jsでアプリケーション開発を行うためのコマンドラインインタフェース(CLI)に基づいた開発ツールです。インタラクティブなプロジェクトの雛形や設定なしで使用できるプロトタイプの作成など、さまざまな機能が用意されています。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

0グッド

0クリップ

投稿2020/11/09 11:58

実現したいこと

学習のためにcloud firestoreを使用して、お金のやりとりアプリを作成しています。
数字を入力しボタンを押した際に、片方のdocからは入力した数字を引く。もう片方のdocからは入力した数字を足すというシンプルなアプリです。

何かエラーが起こった時のためにDBに整合性を持たせるためにTransaction処理を施したいです。

ソースコード

JavaScript

1const subtract = firebase.firestore().collection('wallet').doc(subtractTest); 2const add = firebase.firestore().collection('wallet').doc(addTest); 3 4firebase.firestore().runTransaction(transaction => { 5return transaction.getAll(subtract, add) // エラー発生箇所 6// ここから下はあまり関係ないかもしれません 7.then(docs => { 8// 上記「実現したこと」蘭の「入力した数字を引く」処理 9const subtractWallet = docs.data().wallet - this.state.sendInputWallet; 10 transaction.update(sendUserData, { 11 wallet: this.state.wallet = subtractWallet 12 }); 13// 上記「実現したこと」蘭の「入力した数字を足す」処理 14const addWallet = docs.data().wallet + parseInt(this.state.sendInputWallet); 15 transaction.update(reseiveUserData, { 16 wallet: reseiveWalletUserExtract[0].wallet = addWallet 17 }); 18})

発生しているエラー

Uncaught (in promise) TypeError: transaction.getAll is not a function

試したこと1

ソースコード4行目の.getAll.getへ変換しました。

エラー発生
Function Transaction.get() requires 1 argument, but was called with 2 arguments.

.getの場合は引数は1つでないといけないみたいです。

試したこと2

無茶苦茶かもしれませんが、.getAllを削除し、以下のように記述しました。

記述内容
return transaction(sendUserData, reseiveUserData)

エラー発生
Uncaught (in promise) TypeError: transaction is not a function

.getAllを削除する前と同じエラーが発生しました。
このエラーを見て、自分で解決するのが困難であると考えました。

何が原因だと考えるか

1、複数のdocを一度にTransactionすることができない。
2、そもそもTransaction処理で.getAllを記述すること自体が間違えている。

他にfirebaseにおけるTransaction処理の記述方法がございましたら、ご教授願いたいです。
よろしくお願いいたします。

参考にしたサイト

MDN TypeError: "x" is not a function

複数のgetを持つFirestoreトランザクション

TypeScript & React & Firebase で何かつくってみる7 Functions 4

Firestoreの複数のgetトランザクション、angelfire2、google-cloud-firestoreによるトランザクション

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

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

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

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

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

guest

回答1

0

ベストアンサー

firebaseにおける他のTransaction処理の記述方法について考えてみました

何かエラーが起こった時のためにDBに整合性を持たせる、とのことでしたので batch書き込みを利用してみてはどうでしょう。

https://firebase.google.com/docs/firestore/manage-data/transactions

数字を入力しボタンを押した際に、片方のdocからは入力した数字を引く。もう片方のdocからは入力した数字を足すというシンプルなアプリです。

事前に2つのdocから値を取得しておいて、足し引きなど値の処理は書き込みをする前に済ませておき、上記のバッチ処理で書き込み処理をすれば「DBに整合性を持たせる」の要件は満たせると思いますがいかがでしょうか。

投稿2020/11/11 13:48

hukurouo

総合スコア108

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

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

kazamidori2140

2020/11/12 21:42

回答ありがとうございます。 Transactionが厳しそうなので、batch処理に切り替えて試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問