Skip to content

fix: 修复 middleware 和 API routes 的 Edge Runtime 兼容性问题#8

Merged
ding113 merged 2 commits intomainfrom
dev
Oct 27, 2025
Merged

fix: 修复 middleware 和 API routes 的 Edge Runtime 兼容性问题#8
ding113 merged 2 commits intomainfrom
dev

Conversation

@ding113
Copy link
Owner

@ding113 ding113 commented Oct 27, 2025

问题描述

使用非 admin key 登录 Dashboard 时报错 500:

Error: The edge runtime does not support Node.js 'net' module.

根本原因

  • Next.js middleware 默认运行在 Edge Runtime
  • Edge Runtime 不支持 Node.js 的 net 模块
  • postgres-js 驱动依赖 net 模块进行数据库连接
  • middleware.ts 中调用 validateKey() -> 查询数据库 -> 触发错误

修复内容

核心修复(必须)

  • src/middleware.ts: 添加 export const runtime = "nodejs" 声明

防御性修复(最佳实践)

为所有使用数据库的 API routes 添加显式 runtime 声明:

  • src/app/api/auth/login/route.ts
  • src/app/api/system-settings/route.ts
  • src/app/api/leaderboard/route.ts
  • src/app/api/proxy-status/route.ts
  • src/app/api/admin/system-config/route.ts
  • src/app/api/admin/database/export/route.ts
  • src/app/api/admin/database/import/route.ts
  • src/app/api/admin/database/status/route.ts
  • src/app/api/admin/log-cleanup/manual/route.ts
  • src/app/api/admin/log-level/route.ts
  • src/app/api/internal/data-gen/route.ts

为什么 API routes 之前没出问题?

App Router 的 API routes 默认就是 Node.js runtime,但显式声明是最佳实践。

github-actions bot and others added 2 commits October 27, 2025 16:18
## 问题描述

使用非 admin key 登录 Dashboard 时报错 500:
```
Error: The edge runtime does not support Node.js 'net' module.
```

## 根本原因

- Next.js middleware 默认运行在 Edge Runtime
- Edge Runtime 不支持 Node.js 的 `net` 模块
- postgres-js 驱动依赖 `net` 模块进行数据库连接
- middleware.ts 中调用 validateKey() -> 查询数据库 -> 触发错误

## 修复内容

### 核心修复(必须)
- **src/middleware.ts**: 添加 `export const runtime = "nodejs"` 声明

### 防御性修复(最佳实践)
为所有使用数据库的 API routes 添加显式 runtime 声明:
- src/app/api/auth/login/route.ts
- src/app/api/system-settings/route.ts
- src/app/api/leaderboard/route.ts
- src/app/api/proxy-status/route.ts
- src/app/api/admin/system-config/route.ts
- src/app/api/admin/database/export/route.ts
- src/app/api/admin/database/import/route.ts
- src/app/api/admin/database/status/route.ts
- src/app/api/admin/log-cleanup/manual/route.ts
- src/app/api/admin/log-level/route.ts
- src/app/api/internal/data-gen/route.ts

## 为什么 API routes 之前没出问题?

App Router 的 API routes 默认就是 Node.js runtime,但显式声明是最佳实践。

## 测试

- ✅ TypeScript 类型检查通过
- ✅ 非 admin key 现在可以正常登录 Dashboard

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@claude
Copy link
Contributor

claude bot commented Oct 27, 2025

Claude finished @ding113's task —— View job


代码审查完成 ✅

  • 读取并分析核心修复文件(middleware.ts)
  • 检查所有 API routes 的 runtime 声明
  • 验证是否遗漏任何数据库相关的路由
  • 审查 litellm-prices.json 更新
  • 提供综合评审意见
  • 添加适当的 PR 标签

审查结果

✅ 核心修复正确

middleware.ts (src/middleware.ts:7)

export const runtime = "nodejs";
  • ✅ 正确添加了 Node.js runtime 声明
  • ✅ 注释清晰说明了原因:"使用 Node.js runtime 以支持数据库连接(postgres-js 需要 net 模块)"
  • ✅ 这是修复 500 错误的关键,因为 middleware 中调用 validateKey() 需要查询数据库

✅ 防御性修复全面

已为所有使用数据库的 API routes 添加 export const runtime = "nodejs" 声明:

已覆盖的路由(11 个):

  1. src/app/api/auth/login/route.ts:6 - 调用 validateKey() 查询数据库
  2. src/app/api/system-settings/route.ts:5 - 调用 getSystemSettings() 查询数据库
  3. src/app/api/leaderboard/route.ts:8 - 调用 getSystemSettings() 和排行榜查询
  4. src/app/api/proxy-status/route.ts:7 - 调用 getSession()validateKey() 查询数据库
  5. src/app/api/admin/system-config/route.ts:8 - 调用 getSession()getSystemSettings()
  6. src/app/api/admin/database/export/route.ts:7 - 调用 getSession() 和数据库备份操作
  7. src/app/api/admin/database/import/route.ts:14 - 调用 getSession() 和数据库导入操作
  8. src/app/api/admin/database/status/route.ts:8 - 调用 getSession() 和数据库状态检查
  9. src/app/api/admin/log-cleanup/manual/route.ts:8 - 调用 getSession() 和日志清理操作
  10. src/app/api/admin/log-level/route.ts:5 - 调用 getSession() 查询数据库
  11. src/app/api/internal/data-gen/route.ts:7 - 数据生成操作(需要数据库)

未添加但正确的路由(2 个):

  • src/app/api/auth/logout/route.ts - 仅调用 clearAuthCookie()(只操作 cookie,不查询数据库),不需要 runtime 声明
  • src/app/api/version/route.ts:5 - 显式声明 export const runtime = "edge"(仅调用 GitHub API,不使用数据库),正确使用 Edge Runtime

✅ litellm-prices.json 更新

  • 文件变更:+22512/-24027 行(净减少 1515 行)
  • 这是 LiteLLM 模型价格数据的常规更新
  • 与 Edge Runtime 修复无关,但合并在同一 PR 中是合理的(属于维护性更新)

代码质量评估

优点 👍

  1. 问题定位准确:正确识别了 Edge Runtime 不支持 net 模块的根本原因
  2. 修复策略正确:使用 export const runtime = "nodejs" 是 Next.js 官方推荐的解决方案
  3. 覆盖全面:不仅修复了 middleware,还为所有数据库相关的 API routes 添加了防御性声明
  4. 注释清晰:每个文件都添加了 // 需要数据库连接 注释,便于维护
  5. 最佳实践:显式声明 runtime 是 Next.js 15 的最佳实践,避免隐式依赖默认行为

建议 💡

  1. 测试覆盖:建议在合并前测试以下场景:

    • 使用非 admin key 登录 Dashboard(原始 bug 场景)
    • 访问所有修改过的 API 端点
    • 验证 Edge Runtime 的 /api/version 端点仍然正常工作
  2. 文档更新(可选):可以在 CLAUDE.md 或 README 中添加一条说明:

    所有使用数据库的 API routes 和 middleware 必须显式声明 export const runtime = "nodejs"

  3. CI/CD 检查(未来优化):可以考虑添加 ESLint 规则或 CI 检查,自动检测使用数据库但未声明 runtime 的文件


总结

✅ 推荐合并

此 PR 正确修复了 Edge Runtime 兼容性问题,代码质量高,覆盖全面。所有修改都是必要且正确的:

  • 核心修复:middleware.ts 的 runtime 声明解决了 500 错误
  • 防御性修复:为所有数据库相关的 API routes 添加声明,避免未来出现类似问题
  • 维护更新:litellm-prices.json 的更新是常规维护

没有发现任何代码质量问题或潜在 bug。


@claude claude bot added the bug Something isn't working label Oct 27, 2025
@ding113 ding113 merged commit a92bdf8 into main Oct 27, 2025
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant