--- title: '@nocobase/actions' order: 4 # toc: menu --- # @nocobase/actions ## 介绍 为资源提供了几种默认方法: - list:查看列表 - get:查看详情 - create:创建数据 - update:更新数据 - destroy:删除数据 - set:建立关联 - add:附加关联 - remove:删除关联 - toggle:附加或删除关联 - sort:排序 ## 安装 ```bash yarn add @nocobase/actions ``` @nocobase/actions 不能单独使用,依赖于 @nocobase/database 和 @nocobase/resourcer ## Usage ```ts import Koa from 'koa'; import Database from '@nocobase/database'; import { actions, middlewares } from '@nocobase/actions'; // 配置数据表 const db = new Database({ // 省略 }); const table = db.table({ name: 'posts', fields: [ {type: 'string', name: 'title'}, ], }); await table.sync(); // 配置资源 const resourcer = new Resourcer(); resourcer.registerActionHandlers({ ...actions.common }); resourcer.define({ name: 'posts', }); // 使用 Koa const app = new Koa(); app.use(async (ctx, next) => { ctx.db = database; await next(); }); app.use(resourcer.middleware({ prefix: '/api', })); app.listen(3000); ``` 创建一条 posts 数据 ```bash curl -d '{"title": "title 1"}' -H 'Content-Type: application/json' http://localhost:3000/api/posts ``` ## Actions ### list 查询列表数据 API ```bash # 常规 GET /api/?filter[col1]=val1&fields=col1,col2&sort=-created_at&page=2&perPage=10 # 关系资源 GET /api///?filter[col1]=val1&fields=col1,col2&sort=-created_at&page=2&perPage=10 ``` SDK ```ts // 常规 api.resource('').list({ filter, fields, sort, page, perPage, }); // 关系资源 api.resource('.').list({ associatedKey, filter, fields, sort, page, perPage, }); ``` ### get 查询详情数据 API ```bash # 常规 GET /api//?filter[col1]=val1&fields=col1,col2&sort=-created_at&page=2&perPage=10 # 关系资源 GET /api////?filter[col1]=val1&fields=col1,col2&sort=-created_at&page=2&perPage=10 ``` SDK ```ts // 常规 api.resource('').get({ resourceKey, filter, fields, sort, page, perPage, }); // 关系资源 api.resource('.').get({ associatedKey, resourceKey, filter, fields, sort, page, perPage, }); ``` ### create 新增数据 API ```bash # 常规 POST /api/?fields=col1,col2 # or 关系资源 POST /api///?fields=col1,col2 values # JSON 格式 ``` SDK ```ts // 常规 api.resource('').create({ fields, values }); // 关系资源 api.resource('.').create({ associatedKey, fields, values, }); ``` ### update 更新数据 API ```bash # 常规 PUT /api//?fields=col1,col2 # 关系资源 PUT /api////?fields=col1,col2 values # JSON 格式 ``` SDK ```ts // 常规 api.resource('').update({ resourceKey, fields, values, }); // 关系资源 api.resource('.').update({ associatedKey, resourceKey, fields, values, }); ``` ### destroy 删除数据 API ```bash # 常规 DELETE /api// # 关系资源 DELETE /api//// # 常规,通过 filter 参数 DELETE /api/?filter= # 关系资源,通过 filter 参数 DELETE /api///?filter= ``` SDK ```ts // 常规 api.resource('').destroy({ resourceKey, filter, }); // 关系资源 api.resource('.').destroy({ associatedKey, resourceKey, filter, }); ``` ### set 建立关联,旧关联会解除。此操作需要显式声明 actionName。 API ```bash POST /api///:set/ values ``` SDK ```ts api.resource('.').set({ associatedKey, resourceKey, values, }); ``` ### add 关联的附加操作,此操作需要显式声明 actionName。 API ```bash POST /api///:add/ values ``` SDK ```ts api.resource('.').add({ associatedKey, resourceKey, values, }); ``` ### remove 移除关联,此操作需要显式声明 actionName。 API ```bash POST /api///:remove/ ``` SDK ```ts // 常规 api.resource('').remove({ resourceKey, }); // 关系资源 api.resource('.').remove({ associatedKey, resourceKey, }); ``` ### toggle API ```bash POST /api///:toggle/ ``` SDK ```ts // 常规 api.resource('').list({ resourceKey, fields, }); // 关系资源 api.resource('.').list({ associatedKey, resourceKey, fields, }); ``` ### sort API ```bash # 常规 GET /api/:sort/ # 关系资源 GET /api///:sort/ ``` SDK ```ts // 常规 api.resource('').sort({ resourceKey, values: { field, // 默认为 sort 字段 target: { id: 5, }, }, }); // 关系资源 api.resource('.').list({ associatedKey, resourceKey, values: { field, // 默认为 sort 字段 target: { id: 5, }, }, }); ``` ## Middlewares ### associated 注入 associated 实例,同时会提供 resourceField 字段。 关系资源 `.` 时,resourceName 并不一定是真实的 tableName,而是 fieldName。resource 的 tableName 为 resourceField.target。 ### dataWrapping 输出的 JSON 会用 data 包裹。 用法: ```ts app.use(dataWrapping); ``` 用例: ```ts ctx.body = []; ``` 最终输出的 response body 为: ```ts { data: [], } ```