Strapi получить посты по slug вместо id
При использовании связки Next.js и Strapi вы скорее всего захотите получить записи не по id, которое используется по умолчанию методом findOne, а по slug.
Решение выглядит следующим образом:
Для каждого типа записи создаем кастомный роут, например, для постов.
src/api/post/routes/01custom.js
module.exports = {
routes: [
{
method: "GET",
path: "/posts/:slug",
handler: "api::post.post.findBySlug",
},
],
};
И кастомный контроллер.
src/api/post/controllers/01custom.js
'use strict';
/**
* work controller
*/
const { sanitize } = require('@strapi/utils');
const { createCoreController } = require('@strapi/strapi').factories;
module.exports = createCoreController('api::post.post', ({ strapi }) => ({
async findBySlug(ctx) {
const { slug } = ctx.params;
const query = {
filters: { slug },
...ctx.query,
};
const post = await strapi.entityService.findMany('api::post.post', query);
const schema = strapi.getModel('api::post.post');
const sanitizedEntity = await sanitize.contentAPI.output(post, schema);
return this.transformResponse(sanitizedEntity[0]);
},
}));
ВНИМАНИЕ: не забудьте включить разрешение для findBySlug в разделе Strapi Admin > Settings > Roles > Public