データストアで検索を行い、データの存在状態によって処理分けすることがあります。そんな時に間違った書き方をすると、思わぬ不具合につながります。今回はそんな問題を回避する方法を紹介します。
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は使えませんので注意してください。