ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

データストアのデータ存在チェック法(JavaScript編)

f:id:mbaasdevrel:20180913163950p:plain

データストアで検索を行い、データの存在状態によって処理分けすることがあります。そんな時に間違った書き方をすると、思わぬ不具合につながります。今回はそんな問題を回避する方法を紹介します。

ifだけではダメ

例えばこんなコードを記述したとします。もちろんデータはありません。

const Nothing = ncmb.DataStore('Nothing');
const item = await Nothing
  .equalTo('objectId', 'nothing')
  .fetch();
if (item) {
  console.log('データあり');
} else {
  console.log('データなし');
}

このコードを実行すると、データありと出力されます。itemは空のオブジェクトであり、空のオブジェクトはtrueとして判定されます。

catchにはいきません

次に以下のようなコードを書いたとします。データがなかったとしても、catchにいくことはないので注意してください。catchにいくのはネットワークエラーや署名や権限エラーなど、システム上のエラーによる場合のみです。通信が正常に行えている場合、データがなかったとしても正常処理として then に送られます。

const Nothing = ncmb.DataStore('Nothing');
const item = await Nothing
  .equalTo('objectId', 'nothing')
  .fetch()
  .then(item => {
    console.log('データあり');
  })
  .catch(e => {
    console.log('データなし');
  });

判定方法

objectIdの存在をチェック

データがない場合は空のオブジェクトになりますので、 objectIdの存在によって判断できます。 2021/09/08 fetch()→fetchById()へ変更いたしました。

const Nothing = ncmb.DataStore('Nothing');
const item = Nothing
  .fetchById("objectId")
  .then(item => {
    console.log('データあり');
  })
  .catch(e => {
    console.log('データなし'); //objectId が存在しない場合、E404001 No data availableエラーが発生します
  });

Object.keysを使う

オブジェクトのキーの数で判定もできます。

const Nothing = ncmb.DataStore('Nothing');
const item = await Nothing
  .equalTo('objectId', 'nothing')
  .fetch();
if (Object.keys(item) > 0) {
  console.log('データあり');
} else {
  console.log('データなし');
}

まとめ

mBaaSのデータストアはとても柔軟であり、存在しないクラス、存在しないデータがあってもエラーにはならず、空のデータが返ってくるのみとなっています。そのため、取り扱いに注意しないと正しい判定ができなくなります。なおfetchの場合は最初の1件ですが、fetchAllは空の配列が返ってきます。その場合はObject.keysは使えませんので注意してください。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。