前言: 因为目前Strapi 不能在components里面设置Dynamic zone。所以我添加了多个field,自己写了个Middlewares 来校验request,用拦截方式来实现动态参数的效果。
- create middleware
src/middlewares/adminUIValidations.ts
const {ErrorCode,throwApplicationError} = require("./errors.cms");
// validation function
function isExchangeFileInvalid(arr) {
arr.forEach((item) => {
console.log(item);
if (item.documentType === "File" && !item.uploadFile) {
throwApplicationError(ErrorCode.CMS_ER01);
}
if (item.documentType != "File" && !item.url) {
throwApplicationError(ErrorCode.CMS_ER02);
}
if ((item.documentType === "File" && item.url) || (item.documentType != "File" && item.uploadFile)) {
throwApplicationError(ErrorCode.CMS_ER03);
}
if (!item.isPublic && !item.teamCode) {
throwApplicationError(ErrorCode.CMS_ER04);
}
});
}
//validations object that can hold input validations for all the various
//collection types. To add validation for a new collection type, simply add
// 'newCollection' : (data) => {...validation code here...}
const validations = {
'story': (body) => {
if (body?.uploadFiles) {
isExchangeFileInvalid(body.uploadFiles || []);
}
}
}
const getCollectionNameFromRequestUrl = (reqUrl) => {
if (reqUrl.includes('::')) {
const after = reqUrl.split('::')[1];
if (after.includes('.'))
return after.split('.')[0]
else
return null;
} else
return null;
}
module.exports = () => {
return async (ctx, next) => {
//Perform input validations only for create & update requests
if (ctx.request.method === 'PUT' || ctx.request.method === 'POST') {
//Perform input validation only for requests coming to the Strapi Admin
//content-manager
if (ctx.request.url.includes('/content-manager/collection-types/api::') ||
ctx.request.url.includes('/content-manager/single-types/api::')) {
const apiName = getCollectionNameFromRequestUrl(ctx.request.url);
console.log(apiName);
console.log(Object.keys(validations));
if (Object.keys(validations).includes(apiName)) {
let data = ctx.request.body;
await validations[apiName](data);
}
}
}
await next();
}
}
src/middlewares/errors.cms.ts
const {ApplicationError} = require("@strapi/utils").errors;
enum ErrorCode {
CMS_ER01,
CMS_ER02,
CMS_ER03,
CMS_ER04
}
class CmsErrorInfo{
readonly code: string;
readonly message: string;
}
const errorCodes: { [key: number]: CmsErrorInfo } = {
[ErrorCode.CMS_ER01]: {
code: "CMS-ER01",
message: "Please input uploadFile"
},
[ErrorCode.CMS_ER02]: {
code: "CMS-ER02",
message: "Please input url"
},
[ErrorCode.CMS_ER03]: {
code: "CMS-ER03",
message: "Please select either to upload a file or enter a link, multiple uploads are not allowed."
},
[ErrorCode.CMS_ER04]: {
code: "CMS-ER04",
message: "Team code cannot be empty when document is not public"
},
};
function throwApplicationError(code: number): void {
const info= errorCodes[code];
console.log(info);
if (info){
throw new ApplicationError( `[ ${info.code} ] ${info.message}`);
}else {
throw new ApplicationError( "Unknown exception");
}
}
export { ErrorCode,throwApplicationError };
- 挂载
config/middlewares.ts
加一行
'global::adminUIValidations', // custom middleware that does not require any configuration
参考:
https://docs.strapi.io/dev-docs/configurations/middlewares