在 getStaticProps 中使用路由器

Est*_*n89 4 next.js

我正在尝试从一个因 URL 而异的 API 中获取数据,尝试使用 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,
    },
}
}
Run Code Online (Sandbox Code Playgroud)

它回来了:

TypeError: Cannot read property 'query' of undefined
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*lev 7

getStaticProps称为在构建时。您没有路由器,因为没有执行任何请求。

如果动态页面看起来像/pages/[pid].js您可以pidcontext.params.pid.

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

请注意,对动态路由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
  };
}
Run Code Online (Sandbox Code Playgroud)

此外,您不能调用自己的 API,getStaticProps因为它是在构建时执行的(没有服务器在运行)。您可以直接从数据库中获取数据,而无需 API 调用。

我建议阅读Next.js Data fetching获取更多示例和详细信息。

或者,您可以改为在客户端获取数据。

在客户端获取数据

获取静态道具

  • > 此外,您无法在 getStaticProps 中调用您自己的 API,因为它是在构建时执行的(没有服务器正在运行)。您可以直接从数据库获取数据,无需调用 API。这部分实际上不是真的。您可以在“getStaticProps”中使用 fetch 或类似的 API 调用 API,然后将响应(经过或不经过进一步处理)作为 props 返回到页面。导出异步函数 getStaticProps(context) { const response = wait GraphQLRequest(); // 或另一个异步获取 return { props: response // 来自 API } } (2认同)