GitHub Actions部署Next.js到Azure静态Web应用时出现INVALID_URL错误
解决Next.js部署Azure静态Web应用时API路由的ERR_INVALID_URL错误
问题根源
本地运行时,Next.js API路由的request.url是带完整协议和主机的URL(比如http://localhost:3000/api/reports?id=xxx),但在GitHub Actions构建/act模拟环境中,request.url可能仅为相对路径(比如/api/reports?id=xxx),直接用new URL(request.url)会因缺少协议头触发ERR_INVALID_URL错误。
可行解决方案
- 补全基础URL再解析:在API路由处理函数中,先给相对路径补全基础URL,避免解析失败。示例代码:
import { NextRequest } from 'next/server'; export async function GET(request: NextRequest) { // 优先用环境变量的基础URL,本地默认localhost const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; // 用第二个参数作为基础URL,处理相对路径 const url = new URL(request.url, baseUrl); // 正常获取查询参数 const id = url.searchParams.get('id'); const partitionKey = url.searchParams.get('partitionKey'); // 后续业务逻辑... return new Response(JSON.stringify({ id, partitionKey }), { status: 200 }); } - 设置构建环境变量:在GitHub Actions的构建步骤中,添加
NEXT_PUBLIC_BASE_URL环境变量,值为你的Azure静态Web应用域名(比如https://your-azure-swa-name.azurestaticapps.net),确保构建和运行环境的URL解析一致。 - 排查顶层执行代码:检查
route.tsx中是否有顶层(不在处理函数内)的代码尝试解析request.url——这类代码会在构建阶段执行,而此时request对象不存在,直接触发错误。所有URL解析逻辑必须放在GET/POST等请求处理函数内部。 - 对齐act模拟环境:用act测试时,添加和GitHub Actions一致的环境变量,比如:
act -e .github/workflows/your-workflow.yml -s NEXT_PUBLIC_BASE_URL=https://your-azure-swa-name.azurestaticapps.net
验证步骤
- 本地运行
npm run build && npm start,访问http://localhost:3000/api/reports?id=SOME_ID&partitionKey=SOME_KEY确认正常返回结果。 - 用act模拟构建流程,检查是否再无
ERR_INVALID_URL错误。 - 推送代码到GitHub,等待Azure静态Web应用部署完成后,访问线上API路由验证功能。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

