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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

761閲覧

Firebaseにて、ローカルとホスティング環境での動作が異なります

gano

総合スコア39

Firebase

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/05/30 02:19

編集2020/05/30 02:26

状況

タイトルの通り、Firebaseを利用しておりますが、
ローカルで実行した場合と、ホスティング後で挙動が異なります。

書いてるコード

Firestoreからデータをfetchするために、
Collectionクラスをまず作りました。
実際のCollection (下の例では testsコレクション)を操作する場合、
Testsクラスを作成し、Collectionクラスを継承して、データを操作します。

typescript

1class Collection { 2 collection: firebase.CollectionReference; 3 4 constructor() { 5  // クラス名の先頭を小文字にする 6 const collectionName = _.lowerFirst(this.constructor.name); 7  this.collection = firestore().collection(collectionName); 8 } 9 10 public fetchAll = async () => { 11  const snapshot = await this.collection.get(); 12 ... 13 return documents; 14 } 15} 16 17// testsコレクションのデータを操作 18class Tests extends Collection{}

どのように動作が異なるのか?

上記のコードをもとに、

Typescript

1await new Tests().fetchAll()

を行うと、

ローカルでは、testsコレクションのデータが取得できますが、
ホスティング後は、空オブジェクトになります。

原因を探ってみると、上述のコードのコンストラクタが悪さをしております。

具体的には、

typescript

1 2class Collection { 3 collection: firebase.CollectionReference; 4 5 constructor() { 6  const collectionName = _.lowerFirst(this.constructor.name); 7  this.collection = firestore().collection(collectionName); 8} 9 ...

の this.constructor.name の値が異なります。

ローカル実行では、 "Tests"とクラス名が取れるのですが、
ホスティング後は、 なぜか "n" という値が出力されます。。。

根本的な原因が分からないので、
consturctorの引数にコレクション名等を取る形に変えるか迷っております。

なぜこのような状況になるのか、
アドバイスをいただけたら幸いです。よろしくお願いいたします。

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

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

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

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

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

hoshi-takanori

2020/05/30 04:00 編集

ホスティングではリリースビルドされて minify/uglify の結果クラス名が短くなってるのでは。クラスや関数の名前に頼らないほうがいい気がします。
gano

2020/05/30 13:32

ありがとうございます。 Typescriptのトランスパイルの結果が見れないのですが、クラス名が短くなっているから動かないというのは非常にしっくりきます。おのおののファイルに定数をおいて定数で管理するようにします。 ベストアンサーにしたいのですが、 同じ内容でかまいませんので、回答にコメントいただけますでしょうか?
guest

回答1

0

ベストアンサー

推測ですが、ホスティングではリリースビルドされて minify/uglify の結果クラス名が短くなってるのではないでしょうか。クラスや関数の名前に頼らないほうがいいと思います。

投稿2020/05/30 18:35

hoshi-takanori

総合スコア7901

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

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

gano

2020/06/01 07:52

ご回答ありがとうございました。 とても参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問