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

NextJs部署后Axios请求本地API失败:ECONNREFUSED 127.0.0.1:3000

问题排查与解决方案

核心问题在于服务器端(getServerSideProps)请求http://localhost:3000/api/...在生产环境完全不成立。本地运行时,你的开发服务器监听3000端口,所以localhost请求有效;但部署到Vercel/Digital Ocean后,服务器环境中没有本地3000端口的服务,自然会出现ECONNREFUSED错误。

正确的解决方式:直接调用API逻辑,而非发HTTP请求

把API路由的核心逻辑提取到独立文件,在getServerSideProps里直接调用,避免不必要的内部网络请求。

  1. 提取API核心逻辑到公共文件
    创建lib/fetchProducts.js,将原API路由里的查询逻辑移到这里:
// lib/fetchProducts.js
import prisma from '../path-to-your-prisma-client'; // 替换为你的Prisma客户端路径

export async function getProducts() {
  try {
    const products = await prisma.product.findMany();
    return { data: products, error: null };
  } catch (err) {
    return { data: null, error: err.message };
  }
}
  1. 修改API路由,复用公共逻辑
    更新原API文件,直接调用上面的函数:
// pages/api/fetches/get-products.js
import { getProducts } from '../../../lib/fetchProducts';

export default async function handler(req, res) {
  const { data, error } = await getProducts();
  if (error) return res.status(500).json({ error });
  res.status(200).json(data);
}
  1. 在getServerSideProps中直接调用逻辑函数
    替换原来的Axios请求,直接调用公共函数:
// pages/index.js
import { getProducts } from '../lib/fetchProducts';

export async function getServerSideProps() {
  const { data, error } = await getProducts();
  
  if (error) {
    return {
      props: { products: [], error }, // 可根据需求做错误页跳转
    };
  }

  return {
    props: { products: data },
  };
}

export default function Home({ products }) {
  // 页面渲染逻辑
}

额外检查点

  • 确认生产环境的Prisma配置使用Supabase生产环境连接字符串,而非本地数据库地址
  • 检查Vercel/Digital Ocean的环境变量是否完整配置(比如DATABASE_URL、Supabase密钥等)
  • 在package.json的build脚本中添加prisma generate,确保部署时生成生产环境客户端:
    "scripts": {
      "build": "prisma generate && next build",
      // 其他脚本...
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:50:29