- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难理解基于变量的动态路由。我能够获取集合中的项目列表,但不能通过 Next.js 获取具有动态路由的单个页面的单个项目及其字段。
背景
我有一个带有 GraphQL API 的 KeystoneJS headless CMS。我正在尝试创建一个简单的博客,其中包含一个帖子列表和一个单独的帖子页面。我已经能够查询并返回一个帖子列表,但我需要根据 slug 字段获取一个单独的帖子,以便可以在 /posts/[slug].js
访问它。 .
我试过的
我一直在使用 Apollo Client 来处理查询。我有一个 apolloClient.js
连接到 API 的文件:
// apolloClient.js
import { ApolloClient, InMemoryCache } from "@apollo/client";
export default new ApolloClient({
uri: "http://localhost:3000/admin/api",
cache: new InMemoryCache(),
});
我有一个
post.service.js
用于查询 API 的文件:
// post.service.js
import { gql } from "@apollo/client";
import apolloClient from "../_utils/apolloClient";
export async function getAll() {
return apolloClient
.query({
query: gql`
query {
allPosts {
id
term
slug
}
}
`,
})
.then((result) => result.data.allPosts);
}
export async function getBySlug(slug) {
return apolloClient
.query({
query: gql`
query {
Post(slug: $slug) {
id
title
lead
body
}
}
`,
})
.then((result) => {
return result.data.Post;
});
}
最后,在
posts/[slug].js
我正在尝试像这样返回数据:
//[slug].js
import Head from "next/head";
import { ApolloClient, InMemoryCache, gql } from "@apollo/client";
import { getAll, getBySlug } from "../../_services/post.service";
export default function Post({ post }) {
return (
<div>
<Head>
<title>Launchpad</title>
<link rel="icon" href="/favicon.ico" />
</Head>
<main>
<h1>{post.term}</h1>
</main>
<footer>
<p>{post.lead}</p>
</footer>
</div>
);
}
export async function getStaticPaths() {
const posts = await getAll();
const paths = posts.map((post) => ({
params: { id: post.slug },
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const post = await getBySlug(params.id);
return { props: { post } };
}
显然,这行不通。我一定不能将变量(我假设是 slug)正确地传递到查询中,并且在阅读了几个教程后我仍然无法理解它。有没有人看到我做错了什么?
最佳答案
在 getStaticPaths
params
中返回的键对象需要匹配动态路由命名。就您而言,因为您使用的是 posts/[slug].js
对于路线,您需要返回 params
格式为 { slug: post.slug }
.
export async function getStaticPaths() {
const posts = await getAll();
const paths = posts.map((post) => ({
params: { slug: post.slug }, // Rename to `slug`
}));
return { paths, fallback: false };
}
export async function getStaticProps({ params }) {
const post = await getBySlug(params.slug); // Rename to `params.slug`
return { props: { post } };
}
编辑:关于请求问题,以下更改为
getBySlug
应该让它按预期工作。
export async function getBySlug(slug) {
return apolloClient
.query({
query: gql`
query Post($slug: String){
post(slug: $slug) {
id
title
lead
body
}
}
`,
variables: {
slug
}
})
.then((result) => {
return result.data.Post;
});
}
关于reactjs - 如何基于 GraphQL API 的 slug 使用 Next.js 进行动态路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65819076/
我仅使用 slug 来标识网站上的页面,例如: example.tld/view/this-fancy-slug 。这是使用此函数自动从标题生成的: public static function No
哪个是新闻页面上 url 的最佳选择: 动态生成 slug。从对象 ID 加载页面。如果 slug 不匹配,永久重定向到正确的 slug。 myweb.com/542/my-news-item 我看到
slug 是描述或标题页面的 URL 的一部分,通常是该页面的关键字丰富,可改善 SEO。例如在这个网址 PHP/JS - Create thumbnails on the fly or store
刚开始玩 Django,发现了一个链接 here关于如何创建 slug。我被告知对现有模型执行以下更改: from django.template.defaultfilters import slug
我有 2 个自定义帖子类型的帖子。视频帖子和城市指南帖子第一个帖子(视频帖子)包含 url:104.130.239.132/rick-owens/第二个帖子(城市指南)conatins url:htt
我正在创建一个需要 slug 系统的系统。例如,标题为“博客标题:此处”的博客文章的 URL 为: YYYY/MM/DD/the-blog-title-here 我的系统设置得很好,如果您的 URL
我已使用以下代码注册自定义帖子类型: register_post_type( array( 'labels' => // array o
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
我刚刚安装了使用 Sluggable 的学说扩展。 我做这个: Composer .json "stof/doctrine-extensions-bundle": "1.2.*@dev" 应用内核.p
我在为一个私有(private)网站工作。我有 2 个表: 表 A(包含较旧的 slug)。 表 B(新 slug)。 这里的代码用于检查是否存在 slug 并从表 B(单表查询)创建唯一的 slug
我在我的项目中使用了 ui-router,我在文档中看到了两者: .state('app.restaurants.index', { url: '/{slug}', contr
CREATE TABLE news ( id int(11) NOT NULL AUTO_INCREMENT, title varchar (128) NOT NULL, sl
我想转换任何标题,例如一个用户友好的 url 的博客条目。我用了rawurlencode()这样做但它给了我很多奇怪的字符串,比如 %s。 该算法应考虑 Ö、Ä 等德语字符。我想从标题创建一个 url
我想捕获 URL 中的第一个 slug仅限 如果 URL 有一个 slug,如果它在 URL 中有多个 slug 或部分,则忽略它。例如: https://example.com/path/some-
我有一种情况,在 url 的底部我有一个动态 slug 来获取数据。现在我发现我需要一个静态 slug,这将表示一个不同的页面,但仍然可以访问基本动态 slug 以获取信息。 示例路径 /formAB
我正在开发一个简单的博客来学习 Django。我希望每个帖子都有一个这样的路径: /category-1/title-post /category-2/title-post etc.. 低于urls.
该网站非常简单,只有 3 页,主页和 urls.py 中显示的第二个 url 效果很好,但是当我从主题转到单元页面时,我得到: TypeError at /subjects/units/english
在我一直在开发的应用程序中,我遇到了像 /books/:slug, :to => 'books#show', slug:/.*?/ 这样的路由。我很好奇这部分的作用 slug:/.*?/ ? 最佳答案
我尝试使用此查询更改特定帖子的帖子别名: UPDATE wp_posts SET post_name = replace(post_name, 'make-me-happy','make-me-hap
我尝试使用 HarpJS,一个 NodeJS 静态博客生成器。在教程中有这样的元数据示例: for article, slug in public.articles._data a(href="/a
我是一名优秀的程序员,十分优秀!