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

如何在Strapi(TypeScript)中验证组合键唯一性后创建内容?

实现Strapi中Block内容类型的container-key-locale组合唯一验证

我正在使用"@strapi/strapi": "^4.12.5",需要为名为Block的内容类型添加container-key-locale组合的唯一性验证,Strapi UI无法直接设置这类多字段+按locale区分的唯一约束,以下是最佳实现方案:

1. 数据库层面添加唯一约束(可选但推荐)

为从底层防止重复数据,先给数据库表添加组合唯一索引:

  • PostgreSQL执行:
CREATE UNIQUE INDEX idx_blocks_container_key_locale ON blocks (container, key, locale);
  • MySQL执行:
ALTER TABLE blocks ADD UNIQUE KEY idx_blocks_container_key_locale (container, key, locale);

2. 应用层添加生命周期钩子验证

在src/api/block/content-types/block/lifecycles.ts(无则新建)中添加验证逻辑,覆盖创建和更新场景:

import { Strapi } from '@strapi/strapi';

export default {
  // 创建前验证
  async beforeCreate(event) {
    const { container, key, locale } = event.params.data;
    // 查询是否存在相同组合的记录
    const existingBlock = await strapi.db.query('api::block.block').findOne({
      where: { container, key, locale }
    });
    if (existingBlock) throw new Error('container-key-locale组合需唯一');
  },

  // 更新前验证(排除当前记录)
  async beforeUpdate(event) {
    const { container, key, locale } = event.params.data;
    const { id } = event.params.where;
    // 查询是否存在其他记录使用相同组合
    const existingBlock = await strapi.db.query('api::block.block').findOne({
      where: {
        container, key, locale,
        id: { $ne: id }
      }
    });
    if (existingBlock) throw new Error('container-key-locale组合需唯一');
  }
};

3. Admin UI错误提示

Strapi Admin UI会自动捕获钩子抛出的错误,并在表单顶部显示自定义的错误信息,无需额外配置即可实现需求中的提示效果。

测试验证

  • 首次创建en locale下container=home、key=footer的Block,操作成功;
  • 再次创建相同组合的en locale Block,Admin UI会弹出错误提示:container-key-locale组合需唯一;
  • 更新现有Block到已存在的组合时,同样会触发错误提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:55:13