AWS Amplify生产环境Notion数据库ID环境变量未定义问题
检查Amplify环境变量的暴露配置
AWS Amplify不会自动把控制台配置的环境变量传给Next.js,得在构建脚本里手动注入。
打开Amplify控制台的App settings > Build settings,编辑amplify.yml,在build阶段添加变量注入命令:build: commands: - echo "NEXT_NOTION_MARKETING_DATABASE_ID=$NEXT_NOTION_MARKETING_DATABASE_ID" >> .env.production # 其他需要的变量照这个格式添加 - npm run build如果是客户端需要访问的变量,记得变量名加
NEXT_PUBLIC_前缀,控制台也要配置对应的变量名,然后在构建命令里注入:build: commands: - NEXT_PUBLIC_NOTION_MARKETING_DATABASE_ID=$NEXT_PUBLIC_NOTION_MARKETING_DATABASE_ID npm run build验证Next.js环境变量的读取逻辑
- 服务端组件、API路由里,直接用
process.env.NEXT_NOTION_MARKETING_DATABASE_ID读取,再核对一遍拼写和大小写(哪怕你说确认过,再查一次总没错)。 - 客户端组件里,必须用带
NEXT_PUBLIC_前缀的变量,比如process.env.NEXT_PUBLIC_NOTION_MARKETING_DATABASE_ID,不然客户端拿不到。 - 打印变量时区分环境:服务端日志看CloudWatch,客户端日志看浏览器控制台,确认变量在对应环境里有没有加载。
- 服务端组件、API路由里,直接用
核对Amplify部署的环境分支
确认你在控制台配置变量的环境(比如main分支)和实际部署的分支是同一个,别在测试环境配置了变量,却部署了生产分支。去Amplify的Deployments页面看最新部署的构建日志,搜变量名,确认构建阶段有没有正确注入。清除Amplify构建缓存
旧缓存可能导致环境变量不更新,在Deployments页面找到最新部署,点击"Redeploy"并勾选"Clear build cache",重新构建部署。检查Next.js版本的环境变量处理差异
要是用的Next.js 13+ App Router,服务端组件读取变量的方式和Pages Router一致,但得确保在服务端上下文(比如async function ServerComponent())里读取,别在客户端组件里直接读非NEXT_PUBLIC_的变量。
代码示例参考
服务端API路由(app/api/notion/route.js):
export async function POST(request) { const dbId = process.env.NEXT_NOTION_MARKETING_DATABASE_ID; console.log('Database ID:', dbId); // 日志出现在CloudWatch if (!dbId) { throw new Error('NOTION_MARKETING_DATABASE_ID environment variable is missing.'); } // Notion API调用逻辑 }
客户端组件(app/components/NotionClient.js):
'use client'; export default function NotionClient() { const dbId = process.env.NEXT_PUBLIC_NOTION_MARKETING_DATABASE_ID; console.log('Client Database ID:', dbId); // 日志在浏览器控制台查看 return <div>Database ID: {dbId}</div>; }
内容的提问来源于stack exchange,提问作者Blake Lucey

