Next.js 14.1.3执行npm run build报错ECONNREFUSED,dev模式正常
解决Next.js build和Vercel部署时ECONNREFUSED 127.0.0.1:3000错误
核心原因
build阶段或Vercel部署时,代码中存在**硬编码调用http://localhost:3000**的请求,但此时本地3000端口服务未启动(build阶段)或Vercel环境不存在localhost:3000,导致连接被拒绝。dev模式下本地服务正常运行,所以无此问题。
排查与修复步骤
1. 替换所有硬编码的localhost API请求
检查项目中所有页面、组件、工具函数里的fetch请求,将http://localhost:3000/api/xxx这类绝对路径改为相对路径:
// 错误写法 fetch('http://localhost:3000/api/properties') // 正确写法 fetch('/api/properties')
Next.js会自动根据当前环境处理相对路径,无论本地dev还是Vercel部署都能正常工作。
2. 检查工具函数与依赖的内部请求
查看@/utils/getSessionUser、@/actions/dbActions等依赖文件,确认它们内部是否存在调用localhost的逻辑:
- 比如
getSessionUser若依赖NextAuth的session配置,确保没有硬编码localhost作为回调地址; - 如果工具函数中存在跨服务请求,改用环境变量配置目标地址,避免硬编码。
3. 确认预渲染页面的请求逻辑
如果项目中有静态生成(SSG)的页面,build时会执行页面内的fetch或数据获取逻辑:
- 确保这些请求使用相对路径,而非localhost;
- 若需要动态数据,将页面改为Server Component或使用增量静态再生(ISR),避免build阶段触发无效的localhost请求。
4. 修复API路由中的代码优化(非直接错误,但建议处理)
你的app/api/properties/route.js中,POST方法的图片上传逻辑存在效率问题:Promise.all被放在了for循环内部,会导致每次循环都重复等待已添加的promise。调整为:
// 修改后的图片上传逻辑 const imageUploadPromises = []; for (const image of images) { const imageBuffer = await image.arrayBuffer(); const imageArray = Array.from(new Uint8Array(imageBuffer)); const imageData = Buffer.from(imageArray); const imageBase64 = imageData.toString("base64"); // 将上传promise加入数组,不立即等待 const uploadPromise = cloudinary.uploader.upload( `data:image/png;base64,${imageBase64}`, { folder: "propertypulse" } ).then(res => res.secure_url); imageUploadPromises.push(uploadPromise); } // 所有上传请求发起后,统一等待结果 const uploadedImages = await Promise.all(imageUploadPromises); propertyData.images = uploadedImages;
内容的提问来源于stack exchange,提问作者Arijit Debnath
相关产品推荐
相关产品推荐

