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

使用Next.js getStaticProps无法获取Strapi数据的问题求助

问题描述

我尝试在静态生成的Next.js应用中展示Strapi的内容。本地同时运行Strapi(端口localhost:1337)和Next.js(端口localhost:4200),且已禁用Strapi的CORS配置:

{
    name: 'strapi::cors',
    config: {
      enabled: false,
      origin: ['*'],
      methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
      headers: '*'
    },
},

当我在getStaticProps中尝试获取数据时,收到如下错误:

cause: Error: connect ECONNREFUSED ::1:1337
      at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1300:16) {
    errno: -61,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '::1',
    port: 1337
  }

我的getStaticProps代码如下:

export async function getStaticProps() {
  try {
    const res = await fetch('http://localhost:1337/api/pages/2');
    const pages = await res.json();

    return {
      props: { title: pages.data.attributes.title },
    };
  } catch (err) {
    return { props: { title: 'failed' } };
  }
}

有趣的是,若在useEffect钩子中使用相同的获取逻辑却能正常工作:

useEffect(() => {
   getStaticProps();
 }, []);

请问这是什么原因?

原因分析与解决办法

核心问题是代码运行环境不同导致的网络解析差异:

  • getStaticProps是在Node.js服务端/构建阶段执行的,Node.js解析localhost时默认优先用IPv6地址::1,如果你的Strapi没有绑定IPv6,只绑定了IPv4的127.0.0.1,就会出现连接被拒绝的错误。
  • useEffect里的代码是在浏览器端运行的,浏览器解析localhost时一般优先用IPv4的127.0.0.1,刚好能连上你的Strapi服务,所以正常工作。

可行的解决办法

  • 直接用127.0.0.1替代localhost:
    修改getStaticProps中的请求地址:
    const res = await fetch('http://127.0.0.1:1337/api/pages/2');
    
  • 让Strapi同时监听IPv4和IPv6:
    在Strapi的config/server.js配置文件中修改host为:::
    module.exports = ({ env }) => ({
      host: env('HOST', '::'),
      port: env.int('PORT', 1337),
      // 其他原有配置
    });
    
  • 强制Node.js优先用IPv4解析:
    启动Next.js时添加参数:
    next dev --dns-result-order=ipv4first
    

内容的提问来源于stack exchange,提问作者caisah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:35:18