我试图从一个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中使用的正确方法是什么?
3条答案
按热度按时间9wbgstp71#
getStaticProps
在生成时被调用。您没有路由器,因为没有执行请求。如果动态页面看起来像
/pages/[pid].js
,则可以在context.params.pid
中访问pid
。请注意,使用静态导出和动态路由需要
getStaticPaths
。您需要预先指定所有可能的ID,以便Next.js知道要生成哪些页面。此外,**您不能在
getStaticProps
**中调用同一项目的Next.js API路由,因为它是在构建时执行的(没有服务器运行)。您可以直接从数据库获取数据,而无需API调用。我建议阅读Next.js Data fetching以获得更多的示例和细节。
或者,您可以在客户端获取数据。
在客户端提取数据
获取静态属性
kmbjn2e32#
我不确定这是否适用于您的情况,但如果您使用can getServerSideProps,则可以通过以下命令获取查询id:
我知道使用getStaticProps或getServerSideProps有不同的考虑,但正如Nikolai在他的回答中所描述的,在这种情况下使用getStaticProps需要更多的步骤。
nbysray53#
解决这个问题的另一种方法是更改API的架构。
(我知道这可能并不总是可能的或实际的)但是...
如果你修改API,这样你就不需要传递ID,而是在一个API调用中返回所有数据,这样你就不需要在getStaticProps中使用router了。
然后,在您的nextjs应用程序中,您可以查询API的响应,并使用组件内部的路由器。
我知道这将取决于从API返回的数据有多大,以及您是否拥有API端点并可以更改它。
只是个想法。