LoginSignup
1
1

More than 5 years have passed since last update.

Firebase FunctionsとFirestoreでAPIのようなものをやってみた

Posted at

よーしパパファイヤーベース使っちゃうぞー。

と思ったり思わなかったりして、Firebaseで何かやってみるべくさしあたりAPIのようなものを作ってみました。

Firebaseとかfunctionsとかfirestoreについての説明は省略します。

charactersというコレクションにドキュメントをCRUDするAPIです。
Firebase的には HTTPリクエストで関数をトリガー ということになります。

TypeScriptやNoSQLはほぼ初めてなので手探り的に作りましたがなんとか動いたのでまとめてみます。

さいしょに

Firebaseのコンソールでプロジェクトを作って、Firebase CLIをインストールしましょう。

$ firebase init functions
$ firebase init firestore
でファイル類の雛形が作成されます。

コードが書けたらデプロイ。
$ firebase deploy --only functions
$ firebase deploy --only firestore

API

CREATE

POST /characters

functions/src/index.ts
api.post('/characters', (req, res) => {
  const character = {
    "name": req.body.name,
    "description": req.body.description
  };
  firestore.collection('characters').add(character).then(_r => {
    res.json(character);
  }).catch(err => res.send(err));
});

こんなふうにリクエストを送ってみると

post.png

できました。やったね!
ドキュメントのID (UrA...) は自動で振られるようです。

post-result.png

READ

GET /characters/:id

functions/src/index.ts
api.get('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  record.get().then(result => {
    res.json(result.data());
  }).catch(err => res.send(err));
});

さっき作ったドキュメントのIDを指定して、こんなふうにとれます。
get.png

UPDATE

PATCH /characters/:id

functions/src/index.ts
api.patch('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  const character = {
    "name": req.body.name,
    "description": req.body.description
  };
  record.update(character).then(_r => {
    record.get().then(result => {
      res.json(result.data());
    }).catch(err => res.send(err));
  }).catch(err => res.send(err));
});

さっきのドキュメントを一部書き換えます。
patch.png

変わった!
patch-result.png

DELETE

DELETE /characters/:id

functions/src/index.ts
api.delete('/characters/:id', (req, res) => {
  const record = firestore.collection('characters').doc(req.params.id);
  record.delete().then(result => {
    res.send('deleted');
  }).catch(err => res.send(err));
});

これで消せます。
delete.png

まとめ

実用にあたってはもちろんバリデーションや重複チェックやその他いろいろな処理を追加しないといけないわけですが、一番基本的な動作を行うところまではこんな感じでした。

Firestoreのセキュリティまわりも本来はもっといろいろ設定することがあるはずなのでこれから勉強ですね。

せっかく作ったのでそれっぽい名前で置いておきます。
https://github.com/asny23/firebase-functions-api-sample

1
1
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
1