Strapi: Пользовательские маршруты и слизни

RedDeveloper
14.04.2023 12:56
Strapi: Пользовательские маршруты и слизни

Сегодня я расскажу о пользовательских маршрутах и slug. Конечная цель - разработать несколько конечных точек API, которые будут выдавать мне контент по slug, а не по id.

У меня есть модель, которая может быть Page, Products или любой другой моделью. Моя модель имеет:

  • title
  • slug: UUID
  • содержание
  • ...
У меня есть модель которая может быть Page Products или любой другой моделью Моя модель

В классическом Stapi API для получения одного содержимого мне нужно использовать конечную точку finedOne, которая принимает id в качестве параметра:

http://localhost:1337/api/pages/1

Существует обходной путь для получения содержимого по slug без специального кодирования. Использование конечных точек findAll и фильтрация по slug:

http://localhost:1337/api/pages?filters[slug][$eq]=my-slug

Мне не нравится это решение, поскольку оно создает запутанный URL, учитывая необходимость добавления параметра populate. И я также подозреваю, что это решение медленнее, чем пользовательское кодирование. Никаких доказательств относительно скорости, просто подозрение.

Создание пользовательской конечной точки

Я создал отдельный тип для лучшей организации моей пользовательской конечной точки, я назвал его "v1", полезно для версионирования пользовательских конечных точек в будущем. (Вы можете создать v2 и так далее...)

Затем в коде вашего проекта откройте "api/v1/controllers/v1.js" и вставьте этот код:

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

module.exports = createCoreController('api::v1.v1', ({strapi}) => ({    
    page: async (ctx) => {
      const slug = ctx.params['slug'];
      const entry = await strapi.db.query('api::page.page').findOne({ // uid syntax: 'api::api-name.content-type-name'
        where: { slug },
        populate: {
          seo: true,
        },
      });
      console.info(entry);
      return entry
    }
}));

После этого откройте api/v1/routes/v1.js и вставьте его:

const { createCoreRouter } = require('@strapi/strapi').factories;
const defaultRouter = createCoreRouter('api::v1.v1');

const customRouter = (innerRouter, extraRoutes = []) => {
  let routes;
  return {
    get prefix() {
      return innerRouter.prefix;
    },
    get routes() {
      if (!routes) routes = innerRouter.routes.concat(extraRoutes);
      return routes;
    },
  };
};

const myExtraRoutes = [  
  {
    method: 'GET',
    path: '/v1/page/:slug',
    handler: 'api::v1.v1.page',
    config: {
      auth: false,
    },
  }
];


module.exports = customRouter(defaultRouter, myExtraRoutes);

В маршруте я определил путь и связанный с ним контроллер. В контроллере я определил пользовательскую функцию, которая использует Strapi Query Engine для получения моего контента, а также заполняет его тем, что я хочу.

Вот и все.

Кэширование пользовательского маршрута

Теперь, если вы хотите добавить пользовательский маршрут в кэш, проверьте мою предыдущую статью , и просто добавьте в конфигурацию кэширования такие строки:

{ contentType: "api::v1.v1",
    routes: [
      {
        path: '/api/v1/page/:slug+',
        method: 'GET'
      }
    ]
}

Если вы потеряли предыдущие статьи Strapi, вот список читателей:

Strapi

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?

05.05.2023 14:00

Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.

Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом

05.05.2023 11:59

Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря своим методам, они делают код очень простым для понимания и читабельным.

JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы

05.05.2023 11:57

Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний, то, не теряя времени, практикуйте наш бесплатный онлайн тест 1100+ JavaScript MCQs и развивайте свои навыки и знания.

Массив зависимостей в React
Массив зависимостей в React

05.05.2023 09:44

Все о массиве Dependency и его связи с useEffect.