You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js App Routes结合Prismic获取数据问题求助

解决Prismic + Next.js App Router的字段渲染与查询问题

1. 无法获取自定义字段(title、content等)的解决方法

Prismic文档的自定义字段都存储在data属性下,uid是文档的顶层属性。你需要通过page.data.xxx访问自定义字段,而非直接page.xxx。

修改初始代码如下:

import { createClient } from "@/prismicio";
import { PrismicRichText } from "@prismicio/react"; // 富文本字段需导入该组件

export default async function Page({ params }) {
  const client = createClient();
  const page = await client.getByUID("post", params.uid);

  return (
    <main>
      <h1>{page.data.title}</h1> {/* 直接渲染文本类型字段 */}
      {PrismicRichText.asReact(page.data.content)} {/* 转换并渲染富文本字段 */}
      <p>UID: {page.uid}</p>
    </main>
  );
}

2. 查询错误 unexpected field 'my.page.uid' 的修复

你参考的文档示例针对的是page类型自定义类型,但你的自定义类型是post。手动编写查询时需匹配正确的类型前缀:

  • 错误写法:my.page.uid
  • 正确写法:my.post.uid

更推荐使用getByUID方法(如你初始代码),它会自动处理类型匹配,无需手动编写查询语句,避免这类错误。

3. 渲染所有post时的React子元素错误修复

报错Objects are not valid as a React child是因为直接渲染了Prismic富文本字段的原始对象(包含type、text、spans)。必须使用PrismicRichText组件将富文本数据转换为可渲染的JSX。

示例代码(获取并渲染所有post):

import { createClient } from "@/prismicio";
import { PrismicRichText } from "@prismicio/react";

export default async function AllPostsPage() {
  const client = createClient();
  const posts = await client.getAllByType("post");

  return (
    <main>
      <h1>所有文章</h1>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>
            <h2>{post.data.title}</h2>
            {PrismicRichText.asReact(post.data.content)}
            <p>UID: {post.uid}</p>
          </li>
        ))}
      </ul>
    </main>
  );
}

额外注意事项

  • 确保Prismic自定义类型post的字段ID与代码中使用的一致(比如字段ID是title就用page.data.title,若为post_title则用page.data.post_title)。
  • 文本类型字段可直接渲染,富文本字段必须通过PrismicRichText.asReact()处理。

内容的提问来源于stack exchange,提问作者SnooDucks299792

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:33:33