Next.js生产环境部署后API路由无法访问返回500错误求助
Next.js生产环境API路由返回500错误解决方案
核心问题定位
- API路由异常捕获逻辑错误
api.js中S3请求代码写在try块外部,请求出错时无法被捕获,直接抛出未处理异常返回500;同时catch块中重复设置响应状态码,不符合HTTP响应规则。 - 生产环境环境变量缺失
本地开发时.env文件存在AWS相关凭证,但部署到云平台时默认不会上传.env文件,getS3URL无法读取必要的密钥参数导致生成S3链接失败。 - 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
相关产品推荐
相关产品推荐

