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'],
    },
  },
});

大功告成~~

  • 今天就写到这里啦~小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~
  • 大家要天天开心哦

欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

猜你喜欢

转载自blog.csdn.net/tangdou369098655/article/details/131485486
今日推荐