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说明或查阅官方文档,方法名分别为get
、create
、update
、delete
,只需呀在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的情况。批量更新和删除等操作原理类似,在此不一一演示。
我的个人博客: Cytsee’s Blog,欢迎收藏~