Next.js部署Azure CI Pipeline后API路由报500错误,本地运行正常
Next.js部署Azure后中间件配置matcher导致API 500错误排查与解决
问题描述
本地运行正常的Next.js应用,部署到Azure CI Pipeline后所有API路由返回500错误。排查发现:
- 中间件未配置
matcher时,API响应正常; - 一旦添加
matcher: ['/api/(.*)']配置,所有API请求触发500内部服务器错误。
项目结构:
--------src | ----middleware | ----pages | ----api
核心问题排查与解决方案
1. 代码逻辑错误:转义的逻辑与操作符
你的代码中误用了HTML实体&&而非JavaScript逻辑与&&,导致条件判断失效——原本应跳过JWT验证的路由(如/api/user下除getall外的路径)会进入else分支,触发不必要的JWT验证流程,进而引发500错误。
修复方法:
将代码中的&&替换为&&:
if (reqUrl.startsWith('/api/user') && reqUrl !== '/api/user/getall') { // TODO: Implement any middleware logic related to register return NextResponse.next() }
2. 中间件文件位置不符合Next.js规范
Next.js要求middleware.js/ts必须放置在项目根目录或src目录的根层级,不能放在单独的middleware文件夹中。错误的位置会导致部署后中间件加载异常,尤其在Azure环境下。
修复方法:
调整文件结构,将中间件文件移至src根目录:
--------src | ----middleware.js | ----pages | ----api
3. Azure环境变量未正确配置
代码依赖process.env.JWT_SECRET进行JWT验证,若Azure部署时未配置该环境变量,会使用默认密钥,但生产环境可能因权限或配置问题导致密钥无法正确读取,引发JWT验证错误返回500。
修复方法:
- 登录Azure Portal,进入对应应用服务的「配置」→「应用程序设置」;
- 添加
JWT_SECRET变量,值与本地开发环境一致; - 重启应用服务确保配置生效。
4. Matcher规则优化(可选)
若应用配置了basePath,需在matcher规则中包含basePath,否则会导致路径匹配异常。同时可使用更符合Next.js规范的匹配语法:
export const config = { // 适配basePath的示例,若有basePath则替换为实际值 matcher: ['/api/:path*'], }
验证步骤
- 修正代码中的逻辑与操作符,调整中间件文件位置;
- 在Azure中确认
JWT_SECRET环境变量已配置; - 重新部署应用,查看Azure应用服务的「日志流」,确认中间件的
console.log('In middleware...')是否正常输出; - 测试API路由,检查是否返回预期响应而非500错误。
内容的提问来源于stack exchange,提问作者prashant_k
相关产品推荐
相关产品推荐

