next.js 在getStaticProps中使用路由器

hl0ma9xz  于 2023-01-02  发布在  其他
关注(0)|答案(3)|浏览(167)

我试图从一个API中获取数据,这个API根据URL的不同而不同,我试图用withRouter来做,但它似乎在getStaticProps内部不起作用。
我目前有以下代码:

export async function getStaticProps({ router }) {
const pageRequest = `http://localhost:3000/api/posts/${router.query.pid}`
const res = await fetch(pageRequest)
const json = await res.json()
return {
    props: {
        json,
    },
}
}

它回来了:

TypeError: Cannot read property 'query' of undefined

获取URL中的变量以便在getStaticProps中使用的正确方法是什么?

9wbgstp7

9wbgstp71#

getStaticProps在生成时被调用。您没有路由器,因为没有执行请求。
如果动态页面看起来像/pages/[pid].js,则可以在context.params.pid中访问pid

export async function getStaticProps(context) {
  const pid = context.params.pid
  return {
    props: {}, // will be passed to the page component as props
  }
}

请注意,使用静态导出和动态路由需要getStaticPaths。您需要预先指定所有可能的ID,以便Next.js知道要生成哪些页面。

export async function getStaticPaths() {
  return {
    paths: [
      { params: { pid: '1' } },
      { params: { pid: '2' } }
    ],
    fallback: true or false // See the "fallback" section below
  };
}

此外,**您不能在getStaticProps**中调用同一项目的Next.js API路由,因为它是在构建时执行的(没有服务器运行)。您可以直接从数据库获取数据,而无需API调用。
我建议阅读Next.js Data fetching以获得更多的示例和细节。
或者,您可以在客户端获取数据。
在客户端提取数据
获取静态属性

kmbjn2e3

kmbjn2e32#

我不确定这是否适用于您的情况,但如果您使用can getServerSideProps,则可以通过以下命令获取查询id:

export async function getServerSideProps({ query }) {
  const pageRequest = `http://localhost:3000/api/posts/${query.pid}`
  const res = await fetch(pageRequest)
  const json = await res.json()

  return {
    props: {
        json,
    },
  }
}

我知道使用getStaticProps或getServerSideProps有不同的考虑,但正如Nikolai在他的回答中所描述的,在这种情况下使用getStaticProps需要更多的步骤。

nbysray5

nbysray53#

解决这个问题的另一种方法是更改API的架构。
(我知道这可能并不总是可能的或实际的)但是...
如果你修改API,这样你就不需要传递ID,而是在一个API调用中返回所有数据,这样你就不需要在getStaticProps中使用router了。
然后,在您的nextjs应用程序中,您可以查询API的响应,并使用组件内部的路由器。
我知道这将取决于从API返回的数据有多大,以及您是否拥有API端点并可以更改它。
只是个想法。

相关问题