使用 getStaticProps() 将 Next.js 部署到 Vercel 的速率限制问题

Posted

技术标签:

【中文标题】使用 getStaticProps() 将 Next.js 部署到 Vercel 的速率限制问题【英文标题】:Rate limit issue deploying Next.js to Vercel using getStaticProps() 【发布时间】:2020-12-23 01:50:09 【问题描述】:

使用连接到 Apollo 的 Next.js,我有 50 个左右的非动态 URL 使用 getStaticProps() 获取数据。它工作得很好,我喜欢页面加载的方式。我面临的问题是,因为 Vercel 在构建时构建了这些页面的静态版本,所以在大约 40 个之后,我很快就达到了这些页面上使用的 API 的速率限制。建成。鉴于我无法控制这些速率限制,有没有办法限制我在每个 getStaticProps 中的数据调用,以便在构建时分隔这些数据调用?我的getStaticProps 在每个页面上看起来都是这样的:

export async function getStaticProps() 
  const apolloClient = initializeApollo()

  await apolloClient.query(
    query: XXXXXXX,
    variables: handle: "XXXXXXX"
  )

  return 
    props: 
      initialApolloState: apolloClient.cache.extract(),
    ,
    revalidate: 1,
  

一切正常,或者当我的页面较少并且没有足够的页面达到速率限制时。

【问题讨论】:

【参考方案1】:

我最终通过在 promise 中抛出一个包含我的请求的 setTimeout 将我的请求限制了 100 毫秒。在生产构建期间完全按照预期工作。

const sleep = (milliseconds, apolloClient) => 
return (
    new Promise(function(resolve, reject)
        setTimeout(() => 
            const request = apolloClient.query(
                query: XXXXXX,
                variables: handle: "XXXXXX"
            );
            resolve(request);
        , milliseconds)
    );
)

;

导出异步函数 getStaticProps() const apolloClient = initializeApollo()

await sleep(200, apolloClient)

return 
  props: 
    initialApolloState: apolloClient.cache.extract(),
  ,
  revalidate: 1,

【讨论】:

以上是关于使用 getStaticProps() 将 Next.js 部署到 Vercel 的速率限制问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 HOC 包装时,组件不会从 getStaticProps 接收道具

在 NextJS 中使用 Snowflake 无法连接或执行 getStaticPaths/getStaticProps 中的查询

使用 getStaticProps 获取数据 Next.js 和 Typescript

NextJS getStaticProps 没有将返回的道具传递给页面

NextJS:通过上下文将字符串从输入传递到 getStaticProps

Next.JS Redux 调度在 getStaticProps() 中不起作用