You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:47:10