如何在Directus CMS中创建自定义CRUD端点实现数据库操作
实现Directus自定义CRUD端点
假设你已经在Directus中搭建了基础的自定义端点(比如在extensions/endpoints/custom-crud目录下),以下是完整的CRUD操作实现代码:
1. 初始化端点入口文件
创建index.js作为端点核心文件,引入Directus的扩展工具:
import { defineEndpoint } from '@directus/extensions-sdk'; export default defineEndpoint((router) => { // 以下CRUD路由均写在此处 });
2. 读取(Read)- 完整实现
补充带参数的查询逻辑,支持单条/批量读取:
// 批量读取(支持过滤、排序、分页) router.get('/items', async (req, res) => { const { itemsService } = req.services; const { filter, sort, limit, page } = req.query; try { const items = await itemsService.readByQuery({ filter: filter ? JSON.parse(filter) : {}, sort: sort ? sort.split(',') : [], limit: limit ? parseInt(limit) : 20, page: page ? parseInt(page) : 1 }); res.json(items); } catch (error) { res.status(500).json({ error: error.message }); } }); // 按ID读取单条数据 router.get('/items/:id', async (req, res) => { const { itemsService } = req.services; const { id } = req.params; try { const item = await itemsService.readOne(id); res.json(item); } catch (error) { res.status(404).json({ error: '数据不存在' }); } });
3. 创建(Create)
支持单条或批量创建数据:
router.post('/items', async (req, res) => { const { itemsService } = req.services; const payload = req.body; try { // 单条创建 if (!Array.isArray(payload)) { const newItem = await itemsService.createOne(payload); return res.status(201).json(newItem); } // 批量创建 const newItems = await itemsService.createMany(payload); res.status(201).json(newItems); } catch (error) { res.status(400).json({ error: error.message }); } });
4. 更新(Update)
实现单条更新和批量更新:
// 按ID更新单条数据 router.patch('/items/:id', async (req, res) => { const { itemsService } = req.services; const { id } = req.params; const payload = req.body; try { const updatedItem = await itemsService.updateOne(id, payload); res.json(updatedItem); } catch (error) { res.status(400).json({ error: error.message }); } }); // 按过滤条件批量更新 router.patch('/items', async (req, res) => { const { itemsService } = req.services; const { filter } = req.query; const payload = req.body; try { const updatedCount = await itemsService.updateMany( filter ? JSON.parse(filter) : {}, payload ); res.json({ 更新数量: updatedCount }); } catch (error) { res.status(400).json({ error: error.message }); } });
5. 删除(Delete)
支持单条删除和批量删除:
// 按ID删除单条数据 router.delete('/items/:id', async (req, res) => { const { itemsService } = req.services; const { id } = req.params; try { await itemsService.deleteOne(id); res.status(204).send(); } catch (error) { res.status(404).json({ error: '数据不存在' }); } }); // 按过滤条件批量删除 router.delete('/items', async (req, res) => { const { itemsService } = req.services; const { filter } = req.query; try { const deletedCount = await itemsService.deleteMany(filter ? JSON.parse(filter) : {}); res.json({ 删除数量: deletedCount }); } catch (error) { res.status(400).json({ error: error.message }); } });
关键注意事项
- 替换代码中的
itemsService为你实际操作的集合名称(比如集合叫products,就用productsService) - 权限控制:默认继承Directus的权限体系,如需自定义权限,可在路由中添加
req.permissions相关校验 - 错误处理:可根据业务需求调整错误状态码和提示文案
内容的提问来源于stack exchange,提问作者semicolon
相关产品推荐
相关产品推荐

