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

Next.js生产环境部署后API路由无法访问返回500错误求助

Next.js生产环境API路由返回500错误解决方案

核心问题定位

  1. API路由异常捕获逻辑错误
    api.js中S3请求代码写在try块外部,请求出错时无法被捕获,直接抛出未处理异常返回500;同时catch块中重复设置响应状态码,不符合HTTP响应规则。
  2. 生产环境环境变量缺失
    本地开发时.env文件存在AWS相关凭证,但部署到云平台时默认不会上传.env文件,getS3URL无法读取必要的密钥参数导致生成S3链接失败。
  3. S3访问权限限制
    本地环境可能默认持有AWS本地凭证(如~/.aws/credentials)可正常访问S3,但生产环境服务器未被授予S3 bucket的读取权限,或IP未加入S3白名单。

修复方案

1. 修正API路由代码

// api.js 修正后
const axios = require('axios')
const {getS3URL} = require('./aws')

export default async (req, res) => {
  const config = {
    bucket: 'bucket',
    key: 'folder/data.json'
  }

  try {
    // 将S3请求逻辑移入try块捕获异常
    const s3Url = await getS3URL(config)
    const request = await axios.get(s3Url);
    // res.json自动序列化对象,无需手动调用JSON.stringify
    res.status(200).json(request.data)
  } catch (error) {
    // 打印错误到平台日志方便后续排查
    console.error('API请求失败:', error)
    // 单次请求仅返回一次响应
    res.status(500).json({ error: '服务器内部错误', details: error.message })
  }
}

2. 配置生产环境环境变量

  • 进入部署平台的应用配置页,找到环境变量管理模块
  • 将本地.env中所有getS3URL依赖的AWS相关变量(如AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION)完整添加到平台环境变量中,变量名与本地完全一致
  • 保存后重新触发构建部署,使环境变量生效

3. 调整S3访问权限

  • 登录AWS S3控制台,确认对应bucket的策略已给使用的密钥授予s3:GetObject权限
  • 若bucket开启了IP白名单,将部署平台的出口IP段添加到白名单中,数据公开的情况下可直接配置对象的公开读取权限
  • 可临时在API路由中打印生成的S3链接,部署后访问API路由查看平台日志,直接访问链接确认S3地址本身可正常访问

可选优化

Next.js 9.4及以上版本原生支持.env文件读取,可移除next.config.js中的dotenv-webpack相关配置,减少额外依赖带来的冲突问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:03