使用Strapi批量写入数据的方法,REST API批量写入/修改数据

strapi

Strapi

Strapi是一个开源的Node.js内容管理系统(CMS),它提供了一个可扩展的框架,开发者可以使用该框架快速构建自定义的API和其他后端服务。

我们甚至不需要一行代码就可以能够轻松地创建,阅读,更新和删除内容,并且默认提供一个优美的、现代化后台管理页面,集成了用户、角色权限等一系列基础功能,但是,其生成的默认REST API不能一次性post/put多个数据。

弊端:无法批量写入/修改

假设我们有一个名为articles的内容类型,并且要一次性创建两篇文章:

const articles = [
  {
    
    
    "title": "Article 1",
    "content": "Lorem ipsum dolor sit amet."
  },
  {
    
    
    "title": "Article 2",
    "content": "Ut enim ad minim veniam."
  }
];

我们期望的API是这样的:

fetch('https://<your-strapi-url>/articles', {
    
    
  method: 'POST',
  headers: {
    
    
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    
    
    data: articles // articles 是一个 array 而不是默认的 object
  })
})

这么做无疑会报错,这是因为Strapi默认不支持REST API的批量操作,可是当数据量较大时,每次都重复请求API(尤其是服务部署在远程服务器)会导致速度过慢和大量的资源浪费,我们必须实现一次请求批量处理数据。

解决办法:重写核心服务

根据官网文档,我们只需要重写对应断点的核心服务(使用相同的名称来完全替换核心服务)。

依然假设我们有一个名为articles的内容类型,并且要实现上文所示的批量添加数据的功能(传入Array类型的data字段),在strapi项目中定位到如下文件:
/src/api/articles/services/articles.js
其默认内容应该是这样的:

'use strict';

/**
 * articles service
 */

const {
    
     createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::articles.articles');

createCoreService 内部其实就实现了REST API的增删改查功能,这里可以查看createCoreService的Types说明或查阅官方文档,方法名分别为getcreateupdatedelete,只需呀在createCoreService中传入对应的同名函数,那么同名函数就会完全覆盖其默认的函数,完成核心服务的重写。

以新建多个articles记录为例,我们只需重写create函数,判断data类型是Array还是默认的Object,然后执行不同的操作,代码如下:

'use strict';

/**
 * aiwebsite service
 */

const {
    
     createCoreService } = require('@strapi/strapi').factories;

module.exports = createCoreService('api::aiwebsite.aiwebsite',({
    
    strapi})=>({
    
    
    // 重写create核心服务
    async create(params) {
    
    
        let result = []
        const {
    
    data} = params
        if (Array.isArray(data)) {
    
    
            // 如果传入的data类型为Array,则将Array中的每一项逐个写入数据库
            for(const item of data){
    
    
                params.data = item
                result.push(await super.create(params))
            }
        }else{
    
    
            // 如果传入的data类型不为Array,则直接写入数据库
            result = await super.create(params);
        }
        return result;
      }
}));

保存并重启应用,即可通过对应集合(表)的post端点create多条数据,避免了每次新增数据都需要重复请求api的情况。批量更新和删除等操作原理类似,在此不一一演示。

扫描二维码关注公众号,回复: 15243454 查看本文章

我的个人博客: Cytsee’s Blog,欢迎收藏~

猜你喜欢

转载自blog.csdn.net/weixin_42117463/article/details/130568161