Strapi 挂载middlewares

前言: 因为目前Strapi 不能在components里面设置Dynamic zone。所以我添加了多个field,自己写了个Middlewares 来校验request,用拦截方式来实现动态参数的效果。

  1. 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 };
  1. 挂载

config/middlewares.ts
加一行

'global::adminUIValidations', // custom middleware that does not require any configuration

参考:
https://docs.strapi.io/dev-docs/configurations/middlewares

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值