Я использую этот стартер для создания моего блога. По умолчанию вы должны получить доступ к странице статьи по адресу: http://localhost:3000/article?id=1
, я также хотел бы это: http://localhost:3000/article?slug=myslug
.
мой контроллер статьи выглядит следующим образом:
module.exports = {
async findOne(ctx) {
//check if the params id is an id or a slug
const { id } = ctx.params;
// if you use MongoDB database
// we are validating that the id match ObjectID format
if (id.match(/^[0-9a-fA-F]{24}$/)) {
const entity = await strapi.services.article.findOne(ctx.params);
return sanitizeEntity(entity, { model: strapi.models.article });
}
// findOne function works only with IDs
// so we find all and get first entry by using slug
const [entity] = await strapi.services.article.find({ slug: id });
return sanitizeEntity(entity, { model: strapi.models.article });
}
};
маршруты конфигурации статьи являются:
...
{
"method": "GET",
"path": "/articles/:id",
"handler": "article.findOne",
"config": {
"policies": []
}
},
{
"method": "GET",
"path": "/articles/:slug",
"handler": "article.findOne",
"config": {
"policies": []
}
},
...
, если я делаю http://localhost:1337/articles?id=1
или http://localhost:1337/articles?slug=this-is-my-title
, я получаю содержимое обратно, как ожидалось.
Однако, когда я нажимаю http://localhost:3000/article?slug=this-is-my-title
, я получаю следующее:
внутри папки страниц (интерфейс, созданный с помощью Next. js) У меня есть pages/article
:
const Article = () => {
const router = useRouter();
const { data, loading, error } = useQuery(ARTICLE_QUERY, {
variables: { slug: router.query.slug }
});
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {JSON.stringify(error)}</p>;
return (
<Layout>
{console.log(data)}
</Layout>
);
};
и ARTICLE_QUERY
:
const ARTICLE_QUERY = gql`
query Articles($slug: String!) {
article(slug: $slug) {
id
title
content
image {
url
}
category {
id
name
}
published_at
}
}
`;
Нужна ли какая-либо дополнительная конфигурация, чтобы это исправить?