logologo
スタート
マニュアル
開発
プラグイン
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
スタート
マニュアル
開発
プラグイン
API
logologo

クイックスタート

プラグイン開発概要
最初のプラグインを作成
プロジェクトディレクトリ構造

サーバーサイド開発

概要
プラグイン
コレクション
データベース操作
データソース管理
リソース管理
ACL権限制御
ミドルウェア
キャッシュ
イベント
リクエストコンテキスト
マイグレーション
ロガー
I18n 国際化
コマンド
定時タスク管理
テスト

クライアントサイド開発

概要
プラグイン
コンテキスト
ルーター
ACL権限制御
データソース管理
リソース
リクエスト
スタイルとテーマ
ロガー
I18n 国際化
テスト

その他

プラグインアップグレードガイド
言語一覧
依存関係の管理
ビルド
Previous Pageデータソース管理
Next PageACL権限制御
TIP

このドキュメントはAIによって翻訳されました。不正確な情報については、英語版をご参照ください

#ResourceManager リソース管理

NocoBase のリソース管理機能は、既存のコレクションや関連(association)を自動的にリソースへ変換します。これにより、開発者は組み込みの様々な操作タイプを活用して、REST API のリソース操作を素早く構築できます。従来の REST API とは少し異なり、NocoBase のリソース操作は HTTP リクエストメソッドに依存しません。代わりに、明示的に :action を定義することで、実行する具体的な操作を決定します。

#リソースの自動生成

NocoBase は、データベースで定義された collection と association を自動的にリソースへ変換します。例えば、posts と tags という2つのコレクションを定義した場合、以下のようになります。

db.defineCollection({
  name: 'posts',
  fields: [
    { type: 'belongsToMany', name: 'tags' },
  ],
});

db.defineCollection({
  name: 'tags',
  fields: [],
});

これによって、以下のリソースが自動的に生成されます。

  • posts リソース
  • tags リソース
  • posts.tags 関連リソース

リクエスト例:

リクエスト方式パス操作
GET/api/posts:listリストのクエリ
GET/api/posts:get/1単一レコードのクエリ
POST/api/posts:create新規追加
POST/api/posts:update/1更新
POST/api/posts:destroy/1削除
リクエスト方式パス操作
GET/api/tags:listリストのクエリ
GET/api/tags:get/1単一レコードのクエリ
POST/api/tags:create新規追加
POST/api/tags:update/1更新
POST/api/tags:destroy/1削除
リクエスト方式パス操作
GET/api/posts/1/tags:list特定の post に関連するすべての tags をクエリ
GET/api/posts/1/tags:get/1特定の post に紐づく単一の tags をクエリ
POST/api/posts/1/tags:create特定の post に紐づく単一の tags を新規追加
POST/api/posts/1/tags:update/1特定の post に紐づく単一の tags を更新
POST/api/posts/1/tags:destroy/1特定の post に紐づく単一の tags を削除
POST/api/posts/1/tags:add特定の post に関連する tags を追加
POST/api/posts/1/tags:remove特定の post から関連する tags を削除
POST/api/posts/1/tags:set特定の post のすべての関連 tags を設定
POST/api/posts/1/tags:toggle特定の post の tags 関連をトグル
ヒント

NocoBase のリソース操作は、リクエストメソッドに直接依存せず、明示的に :action を定義することで実行する操作を決定します。

#リソース操作

NocoBase は、様々なビジネス要件に対応できるよう、豊富な組み込み操作タイプを提供しています。

#基本的な CRUD 操作

操作名説明適用リソースタイプリクエスト方式示例パス
listリストデータをクエリすべてのリソースGET/POST/api/posts:list
get単一データをクエリすべてのリソースGET/POST/api/posts:get/1
create新規レコードを作成すべてのリソースPOST/api/posts:create
updateレコードを更新すべてのリソースPOST/api/posts:update/1
destroyレコードを削除すべてのリソースPOST/api/posts:destroy/1
firstOrCreate最初のレコードを検索し、存在しない場合は作成すべてのリソースPOST/api/users:firstOrCreate
updateOrCreateレコードを更新し、存在しない場合は作成すべてのリソースPOST/api/users:updateOrCreate

#関連操作

操作名説明適用関連タイプ示例パス
add関連を追加hasMany, belongsToMany/api/posts/1/tags:add
remove関連を削除hasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:remove
set関連をリセットhasOne, hasMany, belongsToMany, belongsTo/api/posts/1/comments:set
toggle関連を追加または削除belongsToMany/api/posts/1/tags:toggle

#操作パラメータ

一般的な操作パラメータには以下が含まれます。

  • filter:クエリ条件
  • values:設定する値
  • fields:返されるフィールドを指定
  • appends:関連データを含める
  • except:フィールドを除外
  • sort:ソート順
  • page、pageSize:ページネーションパラメータ
  • paginate:ページネーションを有効にするか
  • tree:ツリー構造で返すか
  • whitelist、blacklist:フィールドのホワイトリスト/ブラックリスト
  • updateAssociationValues:関連値を更新するか

#カスタムリソース操作

NocoBase では、既存のリソースに追加の操作を登録できます。registerActionHandlers を使用して、すべてのリソースまたは特定のリソースに対して操作をカスタマイズできます。

#グローバル操作の登録

resourceManager.registerActionHandlers({
  customAction: async (ctx) => {
    ctx.body = { resource: ctx.action.resourceName };
  },
});

#特定リソースの操作の登録

resourceManager.registerActionHandlers({
  'posts:publish': async (ctx) => publishPost(ctx),
  'posts.comments:pin': async (ctx) => pinComment(ctx),
});

リクエスト例:

POST /api/posts:customAction
POST /api/posts:publish
POST /api/posts/1/comments:pin

命名規則は resourceName:actionName です。関連を含む場合はドット記法(posts.comments)を使用します。

#カスタムリソース

コレクションとは関係のないリソースを提供したい場合は、resourceManager.define メソッドを使用して定義できます。

resourceManager.define({
  name: 'app',
  actions: {
    getInfo: async (ctx) => {
      ctx.body = { version: 'v1' };
    },
  },
});

リクエスト方式は、自動生成されるリソースと同じです。

  • GET /api/app:getInfo
  • POST /api/app:getInfo(デフォルトで GET/POST の両方をサポートしています)

#カスタムミドルウェア

resourceManager.use() メソッドを使用して、グローバルミドルウェアを登録できます。例えば、以下のようなグローバルロギングミドルウェアを定義できます。

resourceManager.use(async (ctx, next) => {
  const start = Date.now();
  await next();
  const duration = Date.now() - start;
  console.log(`${ctx.method} ${ctx.path} - ${duration}ms`);
});

#特有の Context プロパティ

resourceManager レイヤーのミドルウェアやアクションに入ることができるということは、そのリソースが必ず存在することを意味します。

#ctx.action

  • ctx.action.actionName:操作名
  • ctx.action.resourceName:コレクションまたは関連(association)である可能性があります
  • ctx.action.params:操作パラメータ

#ctx.dataSource

現在のデータソースオブジェクトです。

#ctx.getCurrentRepository()

現在のリポジトリオブジェクトです。

#異なるデータソースの resourceManager オブジェクトを取得する方法

resourceManager はデータソースに属しており、異なるデータソースに対して個別に操作を登録できます。

#メインデータソース

メインデータソースの場合、app.resourceManager を直接使用して操作できます。

app.resourceManager.registerActionHandlers();

#その他のデータソース

その他のデータソースの場合、dataSourceManager を介して特定のデータソースインスタンスを取得し、そのインスタンスの resourceManager を使用して操作できます。

const dataSource = dataSourceManager.get('external');
dataSource.resourceManager.registerActionHandlers();

#すべてのデータソースを反復処理する

追加されたすべてのデータソースに対して同じ操作を実行する必要がある場合は、dataSourceManager.afterAddDataSource メソッドを使用して反復処理し、各データソースの resourceManager が対応する操作を登録できるようにします。

dataSourceManager.afterAddDataSource((dataSource) => {
  dataSource.resourceManager.registerActionHandlers();
});