strapi系列--超详细教你如何建表并在原有官方自动生成的api基础上重写原有查询,修改等接口逻辑,覆盖官方原有默认返回逻辑
目录
为什么要进行后端定制呢?
在使用strapi过程中,项目中大部分需求我们都可以使用官方文档规定的方式来建表,查表,但是有的时候需要我们定制化自己的业务逻辑,那么我们该如何处理这个需求呢?本文以图文并茂的形式,覆盖掉官方的 find, findOne等方法,定制一个我们自己的业务逻辑接口。
Strapi后端的每个部分都可以定制:
- Strapi服务器收到的请求
- 处理请求并触发控制器处理程序执行的路由
- 可以阻止访问路由的策略
- 中间件可以在向前移动之前控制请求流和请求
- 一旦到达路由就执行代码的控制器
- 用于构建控制器可重用的自定义逻辑的服务
- 模型是内容数据结构的表示
- 发送给应用程序的响应
数据准备,快速上手
新建一个表 cake-info
新建三个字段
插入几条数据
设置权限(暂时设置为公共接口)
测试接口
Request URL:
http://localhost:1337/api/cake-infos
Request Method:
GET
默认数据格式:
重写原有find,findOne
目前我们访问接口,使用的是工厂函数默认返回数据结构,如果我们想要添加自定义逻辑,需要我们重写src/api/cake-info/controllers/cake-info.js
重写/api/cake-infos
- 官方文档
- 这个接口对应的是默认的 find方法,我们需要修改src/api/cake-info/controllers/cake-info.js文件,如下:
原始文件:
'use strict';
/**
* cake-info controller
*/
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::cake-info.cake-info');
使用await super.find(ctx)重写src/api/cake-info/controllers/cake-info.js find方法
"use strict";
/**
* cake-info controller
*/
const { createCoreController } = require("@strapi/strapi").factories;
module.exports = createCoreController(
"api::cake-info.cake-info",
({ strapi }) => ({
async find(ctx) {
const { data, meta } = await super.find(ctx);
return { statuss: "success", code: 1, data, meta };
},
})
);
测试重写逻辑
工厂api重写-保留核心逻辑
find
async find(ctx) {
// some logic here
const { data, meta } = await super.find(ctx);
// some more logic
return { data, meta };
}
findOne
包装核心动作(保留核心逻辑)
async findOne(ctx) {
// some logic here
const response = await super.findOne(ctx);
// some more logic
return response;
}
还可以调用自定义service, 完全自定义逻辑,像这样:
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::restaurant.restaurant', ({ strapi }) => ({
async findOne(ctx) {
const sanitizedQueryParams = await this.sanitizeQuery(ctx);
const { results, pagination } = await strapi.service('api::restaurant.restaurant').find(sanitizedQueryParams);
const sanitizedResults = await this.sanitizeOutput(results, ctx);
return this.transformResponse(sanitizedResults, { pagination });
}
}));
create
async create(ctx) {
// some logic here
const response = await super.create(ctx);
// some more logic
return response;
}
直接重写find等并调用自定义service
举个栗子
src/api/test-type/controllers/test-type.js
'use strict';
/**
* test-type controller
*/
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::test-type.test-type', ({ strapi }) => ({
async findOne(ctx) {
try {
const { data } = await super.findOne(ctx);
const result = await strapi.services['api::test-type.test-type']['testInfo'](
data,
ctx.query,
);
ctx.success(result);
} catch (err) {
strapi.log.error(err.message);
ctx.fail(err.message);
}
},
async find(ctx) {
try {
const result = await strapi.services['api::test-type.test-type']['testCatagory'](
ctx.query.lang,
);
ctx.success(result);
} catch (err) {
strapi.log.error(err.message);
ctx.fail(err.message);
}
},
}));
直接调用strapi封装的方法去读取数据库
举个栗子
const data = await strapi.db.query('api::test-type.test-type').findOne({
where: {
id: query.id,
},
populate: {
relation: true,
tests: {
populate: ['test_tags', 'test_detail', 'test_types'],
},
},
});
大功告成~~
- 今天就写到这里啦~小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
- 大家要天天开心哦
欢迎大家指出文章需要改正之处~
学无止境,合作共赢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?