【Strapi】在默认restful接口下批量增加/修改数据(多条)的最佳方法

本文介绍了如何在Strapi中利用全局中间件来处理批量增加和修改数据的需求,通过创建一个统一的处理逻辑,避免逐个端点重写服务,提升开发效率和性能。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

在这里插入图片描述
去年倒腾过一段时间的Strapi,通过修改控制器、服务器实现了批量增改数据的功能。峰回路转,最近又遇到了类似问题,但是之前方法需要对每一个端点都重写服务,很不方便,倒腾了几下,方法来了。

要点:全局中间件

当涉及到在Strapi中实现批量增加和修改数据的功能时,可以通过创建一个全局中间件来实现。本教程将带领你详细了解如何使用该中间件,并提供逐步指导,使其易于理解和实施。

什么是Strapi?

Strapi是一个开源的、用于构建自定义内容管理系统 (CMS) 的工具。它基于Node.js和Koa框架,并提供了一个友好的管理界面,用于创建和管理应用程序的数据模型、API和内容。

为什么需要批量增加和修改数据功能?

在某些情况下,我们可能需要一次性操作多条数据,而不是逐条操作。例如,当我们需要同时创建或更新多个数据记录时,手动逐条操作将非常耗时且低效。批量操作功能可以大大提高开发效率和性能。

创建全局中间件

首先,我们需要创建一个全局中间件,用于处理批量操作请求。在Strapi中,全局中间件用于在请求到达控制器之前或之后执行一些操作。以下是创建全局中间件的步骤:

  1. 在Strapi项目的根目录下,创建一个名为batchUpdate.js的新文件。
  2. 将以下代码复制并粘贴到batchUpdate.js文件中:
import { isBatch, enums } from "../utils/common";
import type { Strapi } from "@strapi/strapi";
import type { Common } from "@strapi/types";
import type { Ctx, DataItem, DataItems, Attributes } from "../types";

async function batchUpdate(ctx: Ctx<DataItems, DataItems>) {
  // 获取请求的内容类型
  const contentType = ctx.request.url.split("/").pop();
  const UID = `api::${contentType}.${contentType}` as Common.UID.ContentType;
  
  // 根据请求方法选择要调用的函数
  const caller = {
    'POST': (UID, itemID, params) => {
      return strapi.entityService.create(UID, params);
    },
    'PUT': strapi.entityService.update,
  }[ctx.request.method];

  // 准备返回结果的模板
  const result = {
    data: [],
    meta: {} as { [key: string]: string | any },
  };

  // 检查内容类型是否存在
  if (!strapi.db.metadata.has(UID)) {
    result.meta.error = enums.ERROR.ContentTypeError;
  } else {
    const { data } = ctx.request.body;

    // 对每个数据项执行相应的操作
    for (const item of data) {
      const r = await caller(UID, item.id, {
        data: item.attributes,
      });

      // 将结果添加到返回结果中
      result.data.push({
        id: r.id as number,
        attributes: r as Attributes,
      });
    }
  }

  return result;
}

export default (config, { strapi: Strapi }) => {
  return async (ctx, next) => {
    // 等待其他中间件完成处理
    await next();

    // 检查是否是批量操作请求
    if (isBatch(ctx)) {
      ctx.response.status = 200;
      ctx.response.body = await batchUpdate(ctx);
    }
  };
};
  1. 保存文件并关闭。

现在,我们已经创建了一个用于处理批量操作请求的全局中间件。下一步是将其添加到Strapi应用程序中,以便在适当的时候调用它。

添加全局中间件到Strapi应用程序

  1. 打开Strapi项目的根目录。
  2. 导航到./config/middleware.js文件。
  3. 在文件中找到以下代码块:
module.exports = ({ env }) => ({
  // ...
});
  1. 在该代码块中,找到settings对象,并在其下方添加以下代码:
batchUpdate: {
  enabled: true,
  order: 999,
  path: path.join(__dirname, "../path/to/batchUpdate"),
},

请确保将路径../path/to/batchUpdate替换为实际的batchUpdate.js文件的路径。

  1. 保存文件并关闭。

现在,全局中间件已成功添加到Strapi应用程序中。请确保替换正确的路径,以便正确引用batchUpdate.js文件。

非常抱歉给你带来了困惑,希望这次提供的步骤能够正确配置全局中间件。如果你有任何疑问,请随时提问。感谢你的理解!

要将全局中间件添加到Strapi应用程序中,需要进行以下步骤:

  1. 打开Strapi项目的根目录。
  2. 导航到./config/functions/bootstrap.js文件。
  3. 在文件的顶部,添加以下代码来引入刚刚创建的全局中间件:
const batchUpdateMiddleware = require("../path/to/batchUpdate");

请确保将路径../path/to/batchUpdate替换为实际的batchUpdate.js文件的路径。

  1. 在同一文件中,找到以下代码:
module.exports = async (strapi) => {
  // ...
};
  1. 在该代码块的末尾,添加以下代码来注册全局中间件:

javascript strapi.app.use(batchUpdateMiddleware(strapi)); ‍

  1. 保存文件并关闭。

恭喜!现在,已经成功添加了全局中间件到Strapi应用程序中。每当有请求到达时,中间件将会检查是否是批量操作请求,并根据需要执行相应的处理。

使用批量操作功能

要使用批量操作功能,需要发送符合特定要求的请求。以下是一些示例请求的说明:

  • 批量创建数据:

    • 请求方法:POST
    • 请求URL:/api/{contentType}(替换{contentType}为实际的内容类型)
    • 请求体:一个包含多个数据项的数组。每个数据项应包含id属性和attributes属性,分别表示数据项的唯一标识和属性。
  • 批量更新数据:

    • 请求方法:PUT
    • 请求URL:/api/{contentType}(替换{contentType}为实际的内容类型)
    • 请求体:一个包含多个数据项的数组。每个数据项应包含id属性和attributes属性,分别表示数据项的唯一标识和要更新的属性。

确保在请求中正确设置请求方法、URL和请求体,以便与批量操作功能配合使用。

总结

在Strapi中实现批量增加和修改数据,可以通过创建一个全局中间件实现,并在后台执行相应的操作。这种方法可以提高开发效率和性能,并且易于使用。

希望这篇教程对你有所帮助!如果你有任何疑问或需要进一步的指导,请随时提问。祝你成功!

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@fai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值