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

Directus JavaScript SDK创建条目时仅返回一个唯一性错误?

问题分析与解决

核心原因

这不是SDK配置错误或Bug,而是Directus结合数据库唯一约束的短路式校验逻辑导致的:
当提交包含多个违反唯一约束的字段时,数据库会在检测到第一个违反约束的字段后立即终止校验并返回错误,Directus只会将这第一个错误传递给SDK,所以e.errors里只会有一项。

验证方式

你可以跳过SDK,直接用Postman等工具向Directus的/items/[COLLECTION_NAME]接口提交重复的email和phone数据,返回的错误响应同样只会包含第一个违反约束的字段,以此确认这不是SDK的问题。

解决方案

如果需要一次性返回所有重复字段的错误,需要在提交前自行做前置校验:

export default defineEventHandler(async (event) => {
  const { postObject } = await readBody(event);
  const errors = [];

  // 检查email是否已存在
  const existingEmail = await directus.request(
    readItems(COLLECTIONS.NAME_OF_COLLECTION, {
      filter: { email: { _eq: postObject.email } },
      limit: 1
    })
  );
  if (existingEmail.length > 0) {
    errors.push({ field: 'email', message: '该邮箱已被注册' });
  }

  // 检查phone是否已存在
  const existingPhone = await directus.request(
    readItems(COLLECTIONS.NAME_OF_COLLECTION, {
      filter: { phone: { _eq: postObject.phone } },
      limit: 1
    })
  );
  if (existingPhone.length > 0) {
    errors.push({ field: 'phone', message: '该手机号已被注册' });
  }

  // 有错误则返回,无错误则提交数据
  if (errors.length > 0) {
    return { success: false, errors };
  }

  try {
    const result = await directus.request(
      createItem(COLLECTIONS.NAME_OF_COLLECTION, postObject),
    );
    return { success: true, data: result };
  } catch (e) {
    // 处理其他非唯一性的错误
    return { success: false, errors: e.errors };
  }
});

补充说明

Directus官方文档未提及该行为,是因为这属于数据库约束的默认处理逻辑,而非Directus或SDK的特殊设定;你提到的PR#19539确实未覆盖多唯一字段错误返回的场景。

内容的提问来源于stack exchange,提问作者jefkepefke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:54:59