strapi系列 | 您所在的位置:网站首页 › 后端大数据给前端的的方式 › strapi系列 |
为什么要进行后端定制呢?
在使用strapi过程中,项目中大部分需求我们都可以使用官方文档规定的方式来建表,查表,但是有的时候需要我们定制化自己的业务逻辑,那么我们该如何处理这个需求呢?本文以图文并茂的形式,覆盖掉官方的 find, findOne等方法,定制一个我们自己的业务逻辑接口。 Strapi后端的每个部分都可以定制: Strapi服务器收到的请求 处理请求并触发控制器处理程序执行的路由 可以阻止访问路由的策略 中间件可以在向前移动之前控制请求流和请求 一旦到达路由就执行代码的控制器 用于构建控制器可重用的自定义逻辑的服务 模型是内容数据结构的表示 发送给应用程序的响应 数据准备,快速上手 新建一个表 cake-infoRequest URL:
http://localhost:1337/api/cake-infos
Request Method:
GET
默认数据格式:
目前我们访问接口,使用的是工厂函数默认返回数据结构,如果我们想要添加自定义逻辑,需要我们重写src/api/cake-info/controllers/cake-info.js 重写/api/cake-infos原始文件: '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方法
包装核心动作(保留核心逻辑) 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'], }, }, }); 大功告成~~ 今天就写到这里啦~小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~ 大家要天天开心哦欢迎大家指出文章需要改正之处~ 学无止境,合作共赢 |
CopyRight 2018-2019 实验室设备网 版权所有 |