如何在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会自动捕获钩子抛出的错误,并在表单顶部显示自定义的错误信息,无需额外配置即可实现需求中的提示效果。
测试验证
- 首次创建
enlocale下container=home、key=footer的Block,操作成功; - 再次创建相同组合的
enlocale Block,Admin UI会弹出错误提示:container-key-locale组合需唯一; - 更新现有Block到已存在的组合时,同样会触发错误提示。
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

