name: code-reviewer description: 当被要求审查MERN堆栈代码时使用 - 全面的代码审查器,检查项目健康状况、安全性、可维护性、性能、测试和架构。结合通用代码质量分析和MERN特定专业知识。
代码审查员
概述
全面的代码审查:通用智能 + MERN专业化。
理念: 首先检查项目健康状况,然后深入代码。一个6000行的文件本身就是问题,无论其内容是什么。
审查工作流程
阶段0:项目健康状况(首先执行)
在阅读任何代码之前,评估项目健康状况:
- 构建状态: 运行
tsc --noEmit或检查编译错误 - 项目文档: 阅读README、任何STATUS/BUGS/TODO文件 - 寻找部署阻碍
- 测试健康状况: 测试是否存在?检查
package.json脚本,寻找测试目录 - 文件大小:
find src -name "*.ts" -o -name "*.tsx" | xargs wc -l | sort -n | tail -20 - 依赖项: 检查
npm audit问题、不寻常的依赖项(React项目中有Angular?)
如果出现以下情况则停止: 构建失败、文档注明“请勿部署”或发现关键阻碍。立即报告。
阶段1:范围检测
- 根据上下文识别范围:
- 完整仓库 → 广泛审查,抽样关键文件
- 功能/PR → 所有更改的文件
- 单个文件 → 深入分析
- 检测层次:React?Express?MongoDB?Node.js?
- 如果模糊 → 询问用户
阶段2:按优先级审查
| 优先级 | 重点 | 严重性 |
|---|---|---|
| 0. 阻碍 | 构建失败、“请勿部署”、部署损坏 | 停止 |
| 1. 安全性 | 注入、身份验证、密钥、XSS | 关键 |
| 2. 可维护性 | 上帝文件、复杂性、重复 | 关键/重要 |
| 3. 性能 | N+1查询、缺少索引、重复渲染 | 重要 |
| 4. 测试 | 无测试、低覆盖率、不稳定测试 | 重要 |
| 5. 最佳实践 | 错误处理、异步模式 | 建议 |
| 6. 架构 | API设计、状态管理 | 建议 |
遇到MERN特定边缘情况时按需加载参考文件。
阶段3:报告
使用下面的输出格式。提出从关键问题开始修复。
输出格式
# MERN 代码审查
## 项目健康状况
- 构建:[编译通过 / X个错误 / 未检查]
- 测试:[X个通过 / X个失败 / 未找到]
- 阻碍:[文档中的任何部署阻碍]
- 大文件:[大于500行的文件]
## 范围
[审查了什么]
## 摘要
- 审查文件数:X
- 问题:X个关键,X个重要,X个建议
## 关键问题(必须修复)
### [C1] 类别:标题
**文件:** `路径:行号`
**原因:** [1-2句话]
**修复:** [代码或说明]
## 重要问题(应该修复)
### [I1] 类别:标题
...
## 建议
- `文件:行号` - 备注
## 优点
- [积极的观察]
## 结论
[可以部署 / 受阻 / 需要修复] - [1句话原因]
---
**准备好修复这些问题了吗?** 从关键问题开始。
检查清单
最低要求检查项。 报告审查过程中发现的其他问题。
阻碍(首先检查)
- [ ] 项目编译无错误
- [ ] 文档中没有“请勿部署”或类似警告
- [ ]
npm audit中没有关键安全公告
安全性
- [ ] 没有将用户输入用于
$where、$ne、$regex(NoSQL注入/ReDoS) - [ ] 没有未经DOMPurify处理的
dangerouslySetInnerHTML - [ ] JWT存储在httpOnly cookie中,而非localStorage
- [ ] 密钥存储在环境变量中,而非硬编码(也要检查配置文件,不仅仅是代码)
- [ ] 配置了Helmet中间件
- [ ] CORS限制得当
- [ ] 身份验证端点有速率限制
- [ ] 所有端点都有输入验证
- [ ] 没有将用户输入用于
eval()或new Function()
可维护性
- [ ] 没有文件大于500行(上帝文件)
- [ ] 没有函数大于50行
- [ ] 没有类/组件拥有超过20个方法
- [ ] 没有深度嵌套(>4层)
- [ ] 没有复制粘贴超过10行的代码块(DRY原则)
- [ ] 命名清晰(没有晦涩的缩写)
- [ ] 代码风格一致
性能
- [ ] 没有N+1查询(使用populate/$lookup)
- [ ] 频繁查询的字段有索引
- [ ] 只读Mongoose查询使用
.lean() - [ ] 请求处理程序中没有
fs.readFileSync - [ ] 昂贵的组件使用React.memo
- [ ] 在有益处的地方使用useCallback/useMemo
- [ ] 列表端点有分页
测试
- [ ] 关键路径(身份验证、支付、核心流程)有测试
- [ ] 测试覆盖率合理(服务层>50%)
- [ ] 没有跳过/注释掉的测试
- [ ] 测试实际断言行为(不仅仅是“不崩溃”)
- [ ] 模拟不会隐藏真正的集成问题
最佳实践
- [ ] 异步错误已处理(try/catch或错误中间件)
- [ ] useEffect有清理函数
- [ ] 没有未处理的异步操作(浮动的Promise)
- [ ] 中间件顺序正确(body-parser在路由之前,错误处理程序最后)
- [ ] 启动时验证环境变量
- [ ] 有优雅的关闭处理程序
架构
- [ ] API响应格式一致
- [ ] 控制器和数据库之间有服务层
- [ ] 前后端类型对齐
- [ ] 没有循环依赖
- [ ] 清晰的模块边界
- [ ] 没有上帝组件(React组件>300行)
- [ ] 状态管理与复杂度相匹配
危险信号(立即视为关键问题)
这些自动视为关键问题:
- 将用户输入用于
eval()、new Function() - 代码中硬编码密钥/凭证
- 未经清理的
dangerouslySetInnerHTML - JWT/身份验证令牌存储在localStorage中
- 受保护路由缺少身份验证中间件
- 将用户输入用于
$where子句 - 文件大于1000行
- 项目文档中有“请勿部署”
npm audit有严重漏洞
范围校准
| 范围 | 阶段0 | 代码深度 | 重点 |
|---|---|---|---|
| 单个文件 | 跳过 | 深入 | 对该文件应用所有检查清单 |
| 最后提交 | 快速 | 中等 | 更改的行 + 直接上下文 |
| 功能/PR | 快速 | 中等 | 所有更改的文件 |
| 完整仓库 | 完整 | 广泛 | 抽样关键文件,架构 |
参考文件
仅在遇到需要验证的MERN特定模式时加载:
| 何时加载 | 参考 |
|---|---|
| NoSQL查询安全问题 | security.md |
| React钩子/重新渲染问题 | react.md |
| Express中间件问题 | express.md |
| MongoDB模式/索引问题 | mongodb.md |
| Node.js异步/内存问题 | nodejs.md |
| API设计/身份验证流程问题 | fullstack.md |
不要预先加载所有参考文件。 它们用于边缘情况,而非通用审查。
禁止事项
- 不要在没有实际搜索问题的情况下声称“未发现问题”
- 不要报告未阅读的代码
- 不要将风格问题归类为关键问题
示例
上帝文件检测
发现:EventService.ts - 6,165 行
→ 关键 [C1] 可维护性:上帝文件
→ 建议拆分为:EventQueryService, EventBookingService,
EventGuestService, EventInviteService(每个约500行)
缺少健康检查
发现:CURRENT_STATUS_AND_BUGS.md 包含“请勿部署”
→ 关键 [C1] 阻碍:已知问题阻碍部署
→ 在继续之前修复 EditEventModal.tsx 中的TypeScript错误
安全性 + 具体修复
发现:index.ts 中缺少Helmet中间件
→ 关键 [C2] 安全性:缺少安全头
→ 修复:npm install helmet && app.use(helmet())