Heroku中KeystoneJS后端触发Next.js前端构建失败求助
解决方案
核心问题:认证方式错误
你用GitHub Access Token请求Heroku API是错误的——Heroku API的认证需要Heroku自身的API密钥,而非GitHub的Token。这就是为什么你直接调用GitHub API下载tarball能成功,但Heroku API返回未授权的原因。
步骤1:获取Heroku API密钥
- 登录Heroku账户,进入「Account Settings」页面,在「API Key」部分复制密钥;
- 或在本地终端执行
heroku auth:token命令,生成临时认证Token(有效期较短)。
步骤2:修改API请求代码
将请求头的Authorization字段替换为Heroku API密钥,注意前缀是Bearer而非token:
await heroku.post(`/apps/${process.env.HEROKU_APP_ID}/builds`, { headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.heroku+json; version=3', Authorization: `Bearer ${process.env.HEROKU_API_KEY}`, // 替换为Heroku API密钥 }, body: { source_blob: { url: `https://api.github.com/repos/${repoOwner}/${repoName}/tarball/${branchName}`, // 可选:如果Heroku拉取GitHub仓库时权限不足,可添加该字段 // github_token: process.env.GITHUB_PERSONAL_ACCESS_TOKEN }, }, });
步骤3:验证Heroku与GitHub的连接有效性
如果修改后仍报错,检查:
- Heroku前端应用的GitHub集成是否正常:进入Heroku应用的「Deploy」页面,确认GitHub仓库已关联,且Heroku有权限访问该私有仓库;
- GitHub Access Token的权限:确保Token拥有
repo权限(因为是私有仓库)。
备选方案:触发GitHub Actions部署(如果适用)
如果你的前端是通过GitHub Actions部署到Heroku的,可直接调用GitHub API触发对应的Workflow:
await fetch(`https://api.github.com/repos/${repoOwner}/${repoName}/actions/workflows/{WORKFLOW_FILE_NAME}/dispatches`, { method: 'POST', headers: { 'Authorization': `token ${process.env.GITHUB_PERSONAL_ACCESS_TOKEN}`, 'Accept': 'application/vnd.github.v3+json', }, body: JSON.stringify({ ref: branchName }) });
这种方式不依赖Heroku API,直接通过GitHub触发部署流程,更适配前后端分离场景。
内容的提问来源于stack exchange,提问作者cloudis
相关产品推荐
相关产品推荐

