# サンプル1（GETサンプル）

NCMB (ニフクラ mobile backend) のGETメソッドのサンプルを、Firebase FunctionsとFirebase Firestoreを使って実装する方法について解説しています。

{% embed url="<https://mbaas.nifcloud.com/doc/current/script/sample_javascript.html#GET%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB>" %}

## **概要**

* NCMBのGETメソッドのサンプルをFirebaseで再現。
* Firestoreの `Item` コレクションからデータを取得し、ランダムに選択されたレコードを返す。

## **Firebase Functionsのコード**

* `get_random` 関数を定義して、Firestoreから `Item` コレクションのデータを取得。
* 取得したデータの中からランダムに1つのドキュメントを選択し、そのデータを返す。
* コード例:

  ```javascript
  const get_random = functions.https.onCall(async (data, context) => {
    const db = admin.firestore();
    const ref = db.collection('Item');
    const snapshot = await ref.get();
    if (snapshot.empty) {
      return null;
    }
    const docIds = snapshot.docs.map(doc => doc.id);
    const randomIndex = Math.floor(Math.random() * docIds.length);
    const randomDocId = docIds[randomIndex];
    const docSnapshot = await ref.doc(randomDocId).get();
    return docSnapshot.data();
  });

  exports.get_random = get_random;
  ```

***

## **アプリ側のコード**

* Firebase Functionsで定義した `get_random` 関数をアプリから呼び出す。
* 結果をコンソールに表示し、エラーがあればハンドリングする。
* コード例:

  ```javascript
      const get_random = httpsCallable(functions, 'get_random');
      get_random().then((result) => {
          // 結果の表示
          log(result.data);
      }).catch((error) => {
          // エラーのハンドリング
          log('Error');
          log(error);
      });
  ```

## 解説

* `result.data` は単純なJSONオブジェクトです。NCMBと異なり、ドキュメントのIDは含まれていません。ドキュメントのIDを結果に含めたい場合は、サーバー側のコードを以下のように変更する必要があります:

  ```javascript
  return {
    id: randomDocId,
    ...docSnapshot.data()
  };
  ```
* Firebase Functionsの `error` オブジェクトは、NCMBのものと異なるので注意が必要です。
