cloudbase-document-database-web-sdk について
CloudBase のドキュメントデータベースを `@cloudbase/js-sdk` で操作する Web 開発者向けスキルです。ブラウザー側のデータ処理、クエリ、リアルタイム監視、権限確認を扱います。
主な機能
- 01ドキュメントデータベースの CRUD
- 02複雑なクエリとページネーション
- 03集計と位置情報クエリ
- 04リアルタイムの `watch()` 監視
- 05セキュリティルールと権限確認
活用シーン
- 01Web アプリにデータベース操作を追加
- 02コレクションの絞り込みとページネーション
- 03データ変更のリアルタイム購読
- 04認証や権限に起因する失敗の調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tencentcloudbase/ skills --skill cloudbase-document-database-web-sdkインストール後、Claude Code で/cloudbase-document-database-web-sdkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
aggregation.mdcomplex-queries.mdcrud-operations.mdgeolocation.mdLICENSE.mdpagination.mdrealtime.mdsecurity-rules.md詳細
兄弟スキル(ローカルのみ)
兄弟の CloudBase スキルは、このスキルと同じ場所に配置されています。../auth-tool-cloudbase/SKILL.md のようなローカル相対パスを使用してください。
参照されている兄弟スキルのファイルがこの環境にない場合は、CloudBase プラグイン一式(または不足しているスキル)のインストールをユーザーに依頼してください。リモートのスキルやプロトコルの Markdown を HTTP 経由で取得し、エージェントのコンテキストに読み込まないでください。
CloudBase ドキュメントデータベース Web SDK
有効化の条件
まずこのスキルを使う場合
- ブラウザーまたは Web アプリで、
@cloudbase/js-sdkを通じて CloudBase ドキュメントデータベースのデータを読み書きする必要がある場合。 - リクエストで、Web フロントエンドにおける
app.database()、db.collection()、.where()、.watch()、ページネーション、集計、または位置情報クエリについて言及されている場合。
コードを書く前に読む場合
- タスクが明らかにブラウザー側のものでも、Web SDK、ミニプログラム SDK、バックエンドアクセスのどれを使うか判断する必要がある場合。
- リクエストがログイン状態、コレクションの権限、またはリアルタイム更新に関わる場合。
あわせて読むもの
- Web のログインと呼び出し元の ID ->
../auth-web-cloudbase/SKILL.md - Web アプリの全般的な構成 ->
../web-development/SKILL.md - ミニプログラムのデータベースコード ->
../cloudbase-document-database-in-wechat-miniprogram/SKILL.md
使用しない場合
wx.cloud.database()を使用するミニプログラムのコード。- サーバー側またはクラウド関数からのデータベースアクセス。
- SQL/MySQL データベースの操作。
- ブラウザー SDK コードを含まない、リソース権限の管理のみを行う場合。
- タスクで CloudBase PostgreSQL(CloudBase PG)に配置するよう明示されている新しい業務テーブル。このスキルを適用する前に、
queryEnv(action="info", envId=...)を呼び出し、EnvInfo.RuntimeBackendsを確認してください。postgresql === trueであり、かつタスクで PG に新しい業務テーブルを作成するよう求められている場合は、そのテーブルについてpostgresql-development-cloudbaseスキルに切り替えてください。この場合はapp.rdb()を使い、PG の行レベルセキュリティ(CREATE POLICY)を適用し、明示的に作成した pgstore バケットに対してapp.storage.from('<bucket>').upload('<key>', file)でアップロードします。- 同じ環境にある既存の NoSQL コレクションには、引き続きこのスキルを使用します。CloudBase PG 環境では PG と NoSQL が共存します。ルールは「PG 環境では NoSQL を使わない」ではなく、「タスクと既存の実装に従う」です。
SDK コードと MCP ツール
SDK コードを書く場合(このスキルを使用):
- タスクで「コードを変更する」または「SDK を使う」と明示的に求められている場合。
- タスクでアプリやフロントエンドのロジック実装を求められている場合。
db.collection().add()、.get()、.update()など、特定の SDK メソッドについて言及されている場合。- 既存の Web プロジェクトに SDK の初期化処理があることがコンテキストからわかる場合(例:
index.jsにcloudbase.init()がすでにある)。
代わりに MCP ツールを使う場合:
- CloudBase リソースの管理(コレクションの作成、権限の設定など)を求められている場合。
- アプリコードを書かずに、管理操作を行うタスクの場合。
writeNoSqlDatabaseContent、managePermissionsなどのツールについて言及されている場合。
重要な違い: ユーザーが「JS SDK を使用して XX 操作を実行する」または「コードを変更する」と言った場合は、プロジェクトファイルに SDK コードを書いてください。アプリレベルのデータ操作に MCP データベース書き込みツールを使用しないでください。
よくある間違い/注意点
- コレクションのルールで認証情報が必要なのに、ユーザーのサインイン前にクエリを実行すること。
- ブラウザーのコードで
wx.cloud.database()や Node SDK のパターンを使用すること。 - 共有の同期的なアプリインスタンスではなく、動的インポートを使って CloudBase を遅延初期化すること。
- セキュリティルールをリクエストの検証ルールではなく、結果のフィルターとして扱うこと。
managePermissions(updateResourcePermission)の呼び出し直後にCUSTOMセキュリティルールが有効になると期待すること。 バックエンドはルールの評価器を 2~5 分 キャッシュします。ルール変更後の最初の書き込みは、式が正しくても気付かないうちに失敗したり、DATABASE_PERMISSION_DENIEDで拒否されたりする場合があります。ルールが間違っていると判断する前に、(a)数分待って同じ書き込みを再試行するか、(b)すべての書き込みでresult.code/result.messageを読み取り、書き込んだばかりの_idに対してget()の往復確認を行って、ルールが有効になっていることを検証してください。Promise が解決しただけで成功と判断しないでください。全体の手順については、security-rules.md→「Propagation And Verification」を参照してください。db.collection(...).add(...)の戻り値の形式を誤って解釈すること。CloudBase Web SDK では、作成されたドキュメント ID はトップレベルのresult._idにあり、result.id、result.data.id、result.insertedIdではありません。- アプリレベルの管理者ユーザーがすべてのレコードを編集/削除でき、編集者は自分のレコードのみ編集/削除できる必要がある CMS スタイルのコレクションで、ルールを
READONLYに単純化しないでください。検証済みのパターンは、auth.uidを使ってuser_rolesからロールを読み取り、doc.authorId == auth.uidと組み合わせるCUSTOMルールです。フロントエンドでの書き込みは.doc(id).update()/.doc(id).remove()のままにできます。 - 大規模なコレクションでページネーションやインデックスを忘れること。
最小限のチェックリスト
- ブラウザー側のドキュメントデータベース操作であることを確認します。
- CloudBase を一度だけ初期化し、同じ
app/dbインスタンスを再利用します。 - CRUD の前に認証要件を確認します。
- 操作内容に合った補足リファレンスファイルを参照します。
概要
このスキルでは、@cloudbase/js-sdk を使ったブラウザー側のドキュメントデータベースの使用方法を扱います。
次の用途に使用します。
- Web アプリでの CRUD
- 複雑なクエリとページネーション
- 集計
watch()を使ったリアルタイムリスナー- 地理位置情報クエリ
標準的な初期化
import cloudbase from "@cloudbase/js-sdk";
const app = cloudbase.init({
env: "your-env-id"
});
const db = app.database();
const _ = db.command;
重要なルール:
- コレクションのルールで認証情報が必要な場合は、クエリの前にサインインします。
- 共有のアプリ/データベースインスタンスを 1 つだけ使用します。
- フレームワークで本当に必要な場合を除き、場当たり的な非同期ローダーの中に初期化を隠さないでください。
クイックルーティング
- CRUD →
./crud-operations.md - 複雑なクエリ →
./complex-queries.md - ページネーション →
./pagination.md - 集計 →
./aggregation.md - リアルタイムリスナー →
./realtime.md - 地理位置情報 →
./geolocation.md - セキュリティルール →
./security-rules.md
コーディングエージェント向けの作業ルール
-
認証モデルから確認する
- ページがログイン済みユーザーの ID に依存する場合は、データベースコードを書く前に Web 認証スキルを確認してください。
-
ブラウザーコードはブラウザー標準の方法で記述する
app.database()とコレクションの参照を使用してください。- MCP の管理フローや SQL の考え方を混在させないでください。
-
セキュリティルールを遵守する
- コレクションルールによって、データが読み込まれる前にリクエストが拒否される場合があります。
- 要件がシンプルなオーナーのみの書き込みアクセスであれば、
READONLYで十分な場合があります。 - 要件が「アプリレベルの管理者はすべて編集・削除でき、編集者は自分のデータのみ操作できる」であれば、
CUSTOMルールを使用してください。検証済みの CMS パターンはget(`database.user_roles.${auth.uid}`).role == 'admin' || doc.authorId == auth.uidです。 - この CMS パターンでは、フロントエンドの書き込みに
.doc(id).update()/.doc(id).remove()を引き続き使用できます。 - 既存のロール用コレクションのうち、
_id == auth.uidで参照できるものを再利用してください。この CMS パターンでは、uid をキーとするuser_rolesを使用できます。 - 取得先のドキュメントが存在しない場合、
get()はリクエストを HTTP 500 で失敗させます。falseを返すわけではなく、||によって評価がスキップされることもありません。アプリでユーザーごとのロールドキュメントを保証できない場合は、ロール一覧を 1 つの共有ドキュメントに保存し、代わりにauth.uid in get(`database.admin_registry.lock`).adminsをテストしてください。 - タスクで権限エラーが発生した場合は、クエリ構文が誤っていると決めつけず、ルールモデルを確認してください。
-
ユーザーにわかりやすいエラーを返す
- データベースエラーは、無視せず、読みやすい UI またはアプリケーションエラーとして扱ってください。
- 書き込みでは、Promise が解決しただけで成功と見なさないでください。
updated/deletedなどの書き込み結果フィールドや、返されたcode/messageを確認してください。
-
作成操作で ID を正しく保存する
- Web SDK の
.add(...)では、新しく作成されたドキュメントの ID はresult._idです。 - ID を
result.id、result.data、その他のドライバー固有のフィールドから取得しないでください。
- Web SDK の
簡単な例
シンプルなクエリ
const result = await db.collection("todos")
.where({ completed: false })
.get();
作成してドキュメント ID を取得する
const result = await db.collection("posts").add({
title: "New article",
content: "...",
createdAt: new Date()
});
const articleId = result._id;
順序付きページネーション
const result = await db.collection("posts")
.orderBy("createdAt", "desc")
.skip(20)
.limit(10)
.get();
フィールドの選択
const result = await db.collection("users")
.field({ name: true, email: true, _id: false })
.get();
ベストプラクティス
- アプリコードでコレクションレベルの型またはモデルラッパーを定義してください。
- 意味が明確なコレクションの命名規則を使用してください。
- 必要なフィールドのみを選択してください。
- 頻繁に使用するフィルターやソートキーにはインデックスを追加してください。
- フロントエンドの CRUD と明示的な権限設計を組み合わせてください。
- 上限のない読み取りの代わりに、ページネーションを使用してください。
エラー処理
try {
const result = await db.collection("todos").get();
console.log(result.data);
} catch (error) {
console.error("Database error:", error);
}
SDK が操作結果を返す場合は、エラーの指標を確認し、読みやすいアプリケーション動作に反映してください。