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

Next.js中无法渲染Strapi文章数据的问题求助

Next.js中无法渲染Strapi文章数据的问题求助

嘿,我看你遇到的问题是在Next.js里从Strapi获取文章数据后,没法正常访问attributes属性对吧?先别着急,咱们一步步来排查和解决~

首先看你打印出来的数据结构:

{
  data: [ { id: 1, attributes: [Object] } ],
  meta: { pagination: { page: 1, pageSize: 25, pageCount: 1, total: 1 } }
}

这里能发现核心问题:你拿到的articles是一个包含data数组和meta信息的完整响应对象,但你在组件里直接把它当成数组来遍历了,自然没法正确访问到attributes。

接下来咱们逐个文件调整:

1. 修正articles.js的数据传递逻辑

在getStaticProps里,你需要把响应对象里的data数组单独提取出来,再传递给组件:

// articles.js
import Layout from '../components/Layout'
import ArticleListItems from '../components/ArticleListItems'
import { fetcher } from '../lib/api'

const ArticlesList = ({ articles }) => {
  return (
    <Layout>
      <ArticleListItems articles={ articles }/>
    </Layout>
  )
}

export async function getStaticProps() {
  // 拿到包含data和meta的完整响应
  const strapiResponse = await fetcher('articles')
  // 只把文章数据数组传递给组件
  return {
    props: {
      articles: strapiResponse.data
    }
  }
}

export default ArticlesList

2. 修复api.js里的小bug

你的fetcher函数里有个未定义变量的问题,当没有options时用到了params但没声明,咱们把这个逻辑理通顺:

// api.js
const baseUrl = process.env.NEXT_PUBLIC_STRAPI_URL

async function fetcher(path, options = {}) {
  let url = `${baseUrl}/${path}`
  // 如果需要传参数,统一用URLSearchParams拼接
  if (options.params) {
    const searchParams = new URLSearchParams(options.params)
    url += `?${searchParams.toString()}`
  }
  console.log(url)
  
  const response = await fetch(url)
  // 先判断请求是否成功,避免后续解析错误
  if (!response.ok) {
    throw new Error(`请求失败:${response.status}`)
  }
  const data = await response.json()
  console.log(data)
  return data;
}

export { baseUrl, fetcher }

3. 优化ArticleListItems.jsx的渲染安全

现在传递过去的articles是正确的数组了,为了防止意外的undefined报错,可以加个可选链操作符:

// ArticleListItems.jsx
const ArticlesListItems = ({ articles }) => {
  // 可以用格式化打印看清楚数据结构
  console.log(JSON.stringify(articles, null, 2))
  return (
    <div className="bg-white">
      {articles && articles.length > 0
        ? articles.map((article) => (
          <li key={article.id}>
            <h1 className="text-sm text-gray-700">{article.attributes?.title}</h1>
          </li>
        ))
        : "no articles"}
    </div>
  )
}

export default ArticlesListItems

另外你之前看到的data : [object Object]是因为直接打印对象时的默认显示,用JSON.stringify格式化打印就能看清完整结构啦~

备注:内容来源于stack exchange,提问作者Camille

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:09:13