在日常前后端分离开发中,最常看到的场景就是测试在群里丢出一个 BUG:页面按钮点了没反应,接口报了个 500,或者某个功能测试环境好好的、一到生产就白屏。接下来就是经典的“三方甩锅”:前端说接口数据不对是后端的问题,后端说接口我用 Postman 测过没问题是你前端参数没传对,最后运维补一句“环境都是好的,你们自己查”。前端 BUG、后端 BUG、环境 BUG 这三个概念,很多工作了两三年的开发其实也说不清楚,全凭感觉定位。本文会基于实际联调经验,整理一套从“现象”到“根因”的分层排查方法,帮你在几分钟内把问题归类,快速锁定到底是哪一端的责任。
这套方法不依赖特定框架,适用于 Vue、React、Java、Node.js、Spring Boot、Nginx、Docker 等常见技术栈。无论你是刚入职的新人,还是经常被拉去救火的全栈开发,都会有用。
1. 前端 BUG、后端 BUG、环境 BUG 到底怎么定义
要区分三类 BUG,先要给它们划清边界。因为很多问题看起来像前端,查到最后是后端;看起来像后端,查到最后是环境配置。
1.1 前端 BUG:浏览器或客户端里的逻辑错误
前端 BUG 是指发生在浏览器、小程序、App 端代码中的错误。它跟服务器没有直接关系,即使后端接口完全正常,前端代码本身也可能出问题。
常见的前端 BUG 包括:
- 页面渲染异常,比如数据拿到了但数组遍历时报错。
- 事件绑定失效,按钮点击没有触发任何逻辑。
- 状态管理混乱,多个组件共享的数据被意外修改。
- 浏览器兼容问题,同一个功能在 Chrome 正常,在某个旧版 Safari 里白屏。
- 打包产物问题,本地开发正常,部署后加载的 JS 还是旧版本。
这种 BUG 的特点是不依赖接口是否正常。前端可以完全不请求后端就自己制造 BUG。
1.2 后端 BUG:服务端接口或业务逻辑的错误
后端 BUG 指的是服务端代码、数据库、接口逻辑等层面的错误。它最直接的暴露形式就是接口响应异常。
常见的后端 BUG 包括:
- 接口返回 500,代码运行时抛出未捕获异常。
- SQL 语句写错,或者表结构变更后没有同步更新代码。
- 参数校验缺失,前端传了空值,后端直接空指针。
- 接口返回的数据结构与前端约定不一致,字段名多了或少了下划线。
- 并发问题,超卖、重复提交、状态覆盖等业务逻辑缺失。
- 性能问题,接口响应时间过长,拖垮前端页面。
后端 BUG 通常不会在浏览器控制台直接暴露,而是要在接口响应、服务端日志、数据库日志中去定位。
1.3 环境 BUG:代码没问题,但运行环境不符合预期
环境 BUG 是最容易背锅、也最难解释的一类。它的特征是代码本身逻辑正确,在某个环境能跑,在另一个环境就跑不起来。问题根本不在这套代码,而在于代码运行所处的环境。
常见环境 BUG 包括:
- Node.js 或 Java 运行时版本不一致,本地用的新语法,服务器上的旧版本不支持。
- npm 或 Maven 依赖安装不完整,又或者原生模块编译失败。
- Nginx 配置了错误的反向代理路径,静态资源加载 404。
- 数据库地址、Redis 地址、第三方服务的环境变量不一致。
- 浏览器缓存了旧版本页面,新代码已经发布但用户看到的还是旧页面。
- 跨域拦截,后端没有配置 CORS 头,浏览器不让前端读取接口数据。
- 容器时间不对、服务器内存不足、磁盘写满导致服务异常。
判断环境 BUG 最核心的一点就是:这套代码在别的环境是正常的,唯独在当前环境不正常,且差异不在业务代码逻辑。
| 类型 | 现象 | 根因 | 典型证据 |
|---|---|---|---|
| 前端 BUG | 页面渲染异常、交互无响应 | 前端代码逻辑错误 | 控制台 JS 报错、Network 请求正常但页面出错 |
| 后端 BUG | 接口报错、数据不符合预期 | 服务端逻辑或数据库错误 | 接口 4xx/5xx、服务端异常日志 |
| 环境 BUG | 同一套代码在不同环境表现不同 | 版本、配置、网络、依赖等外部因素 | 换环境复现、Nginx/配置对比差异 |
2. 为什么三类 BUG 这么容易混淆
理解了定义之后,你可能会想:边界挺清楚的,为什么现实中还是经常争来争去?因为现代 Web 系统的调用链路太长了,一个问题往往会横跨多个环节。
2.1 链路中存在“看不见的中间层”
一次完整的前端请求大致是:浏览器 → Nginx → 后端网关 → 应用服务 → 数据库/缓存。任何一个环节出问题,最终都暴露在浏览器上。但在浏览器的 Network 面板里,你看不到是 Nginx 挂掉了,还是网关超时了,还是数据库慢查询把接口拖死了。
所以就会出现“现象在前端、根因在后端”的情况。比如接口返回 502,浏览器这边只看到一个 Bad Gateway,但实际上可能是后端服务进程挂了,也可能是 Nginx 到应用服务的网络断了。
2.2 报错具有“跨界表现”
最典型的就是跨域报错。当你打开浏览器控制台,看到红色的 CORS error 时,第一反应是“前端出问题了”?其实请求已经从浏览器发出去了,服务端也正常处理并返回了数据,只是浏览器在读取响应时发现缺少Access-Control-Allow-Origin头,于是拦截了响应。这个错误的“表现”在前端,“修改点”在后端或 Nginx,“拦截机制”在浏览器。你能说它是纯前端 BUG 吗?显然不能。
这种跨界表现导致了很多定位误区。看到一个浏览器报错就说是前端问题,是新手最常见的错误。
2.3 缺少统一的“证据标准”
很多人定位 BUG 靠的是“经验”和“感觉”,而不是“证据”。前端开发只盯着自己的代码,后端开发只盯着自己的日志。前端觉得“我请求发得没问题,是你返回的数据不对”,后端觉得“我返回的数据没问题,是你页面渲染不对”。两边都没有用一个统一的证据集来做判断依据。
正确的做法是:所有 BUG 归属判断,都应该基于浏览器开发者工具、接口返回体、服务端日志、环境配置这四类客观证据,而不是基于“谁说话声音大”。
2.4 “在我这是好的”是最大的陷阱
环境 BUG 最经典的场景就是开发说“我本地是好的”,测试说“我这边复现了”。两个环境明明代码一样的,但 Node.js 版本不同、npm 依赖版本不同、Nginx 配置不同,甚至系统时区不同,都会导致行为不一致。
只要涉及多环境问题,第一反应必须切换到“环境对比”模式,而不是继续在代码逻辑里翻来翻去。
3. 定位方法论:从现象到根因,按三层证据推进
判断 BUG 归属,不要直接跳到“是不是前端的锅”这个问题上。推荐按照从下往上的顺序,先看现象,再看代码,最后查环境。
3.1 第一层:现象与请求证据
先别改代码,打开浏览器开发者工具,收集以下信息:
- 页面具体表现是什么?白屏、卡死、弹报错、还是数据不对?
- Console 面板有没有红色报错?报错信息是什么?
- Network 面板中,请求有没有发起?URL 是否正确?
- 接口返回的 HTTP 状态码是多少?
- 接口返回的响应体内容是什么?
这一层能解决大量问题。比如点击按钮没反应,打开 Console 发现有一个Cannot read properties of undefined,那大概率是前端代码的问题;如果 Console 没有报错,Network 里请求都没发出去,也可能是前端逻辑提前 return 了。
3.2 第二层:代码与日志证据
现象层无法确定根因时,进入代码与日志层。
- 前端:检查业务代码中的调用时机、参数处理、渲染逻辑;开启 Source Map 定位压缩代码对应的源码位置。
- 后端:查看接口日志,是否有异常堆栈;检查 SQL 日志和慢查询;确认数据库表结构是否与代码实体一致。
- 中间件:查看 Nginx 的 error.log 和 access.log;查看 Docker 容器日志。
这一层是前后端 BUG 的主要战场。特别是后端 500 错误,只要日志够完整,基本都能直接锁定异常行。
3.3 第三层:环境与配置证据
代码和日志都找不到问题时,大概率是环境问题。检查:
- 当前环境的运行时版本是否和开发环境一致。
- 依赖是否完整安装。前端看
node_modules,后端看 Maven 的jar包或 Python 的site-packages。 - 环境变量、配置文件是否被正确加载。
- Nginx、DNS、防火墙、端口是否通。
- 静态资源路径和打包配置是否正确。
环境问题往往需要“两侧对比”才能发现。把正常环境和异常环境的关键配置拉出来逐项对比,差异项通常就是根因。
4. 前端 BUG 的定位:先看控制台,再看请求,最后看渲染
4.1 前端 BUG 的典型特征
- 页面视觉效果异常,比如布局错乱、样式丢失、白屏。
- 交互逻辑异常,比如点击按钮没有反应、表单校验不弹提示。
- 数据已拿到,但页面展示错误,比如列表是空的、字段显示
undefined。 - 同一个功能在部分浏览器或低版本手机上才复现。
如果你发现 Network 面板里接口请求返回了正常数据,但页面仍然混乱,那就要重点怀疑前端代码了。
4.2 用 Chrome DevTools 逐项确认
前端定位最常用的工具就是 Chrome 开发者工具。
Console 面板:主要看 JS 运行时报错。比如TypeError: xxx is not a function,说明调用了不存在的方法;ReferenceError: xxx is not defined,说明变量声明顺序有问题。
Network 面板:重点看请求的 Method、URL、Status、Request Headers、Response Headers、Response Body。前端 BUG 最常见的场景是:请求没有发出去,或者发送时参数少了字段。
Sources 面板:可以打断点调试。如果确认请求数据正常,但页面渲染不对,就打断点跟踪数据到渲染函数的传递过程,看是哪里把数据改了或者取错了。
Application 面板:查看 Cookie、LocalStorage、SessionStorage。有些问题是因为本地存储了旧数据,导致页面加载后状态异常。
4.3 前端常见错误示例
先来看一个非常典型的前端逻辑问题:请求被某个条件提前拦住了,按钮点击后什么都没发生。
// 文件路径:src/api/user.js import request from './request' export function getUserInfo(userId) { // 如果 userId 为空,这里会直接走 reject, // 导致调用方拿不到接口数据,但 Network 面板里完全看不到请求 if (!userId) { return Promise.reject(new Error('userId 不能为空')) } return request({ url: '/api/user/info', method: 'get', params: { userId } }) }这种时候前端很容易误判为“后端接口挂了”,但打开 Network 面板就会发现,请求根本没有发出去,是前端代码做了拦截。所以“Network 面板有没有真实请求”是区分前端 BUG 和后端 BUG 的第一道分水岭。
4.4 前端 BUG 判断清单
遇到问题时按以下清单过一遍:
- 控制台有没有 JS 报错?如果有,先按前端 BUG 处理。
- Network 里请求有没有发出?没有发出,大概率是前端条件、拦截器或路由配置问题。
- 请求状态码是不是 2xx 或 3xx?如果是,但页面对不上,优先排查前端的渲染逻辑。
- 接口响应数据是否正常?数据正常但页面不对,前端渲染问题。
- 能不能在本地开发环境复现?本地无法复现,反而是打包配置、静态资源路径或部署文件过期的问题。
- 只有某一类浏览器或设备复现?优先考虑兼容性和响应式布局问题。
5. 后端 BUG 的定位:状态码是入口,日志是核心证据
5.1 从 HTTP 状态码分流
当 Network 面板中能看到请求,且确实到达了服务端,状态码就会告诉我们很多信息。
| 状态码 | 含义 | 优先怀疑对象 |
|---|---|---|
| 400 | 请求参数错误 | 前端传参、后端校验 |
| 401 | 未认证 | 登录态、Token 失效 |
| 403 | 无权限 | 后端权限校验、前端未传凭证 |
| 404 | 接口不存在或路由错误 | 后端路由、Nginx 转发规则 |
| 500 | 服务端内部异常 | 后端代码、数据库、缓存 |
| 502 | 网关错误,后端不可达 | 后端服务未启动、Nginx 配置 |
| 504 | 网关超时 | 后端处理太慢、网络超时 |
500 和 502 是典型的“后端或环境嫌疑”。其中 500 多数是代码异常,需要看后端日志;502 则更偏向部署和服务状态问题。
5.2 用后端日志快速定位问题
后端 BUG 最怕的就是日志不完整。好的日志至少应该包含:
- 请求的 URL 和请求参数。
- 处理过程中的关键业务日志。
- 异常发生时的堆栈信息。
- 处理耗时。
下面是一个简单的 Node.js 后端日志示例:
// 文件路径:server/index.js const express = require('express') const app = express() app.use(express.json()) app.get('/api/user/info', async (req, res) => { const userId = req.query.userId console.log(`[INFO] 查询用户信息, userId=${userId}`) try { // 这里故意模拟一个后端逻辑错误 if (userId === '0') { throw new Error('userId 不合法') } res.json({ code: 0, message: 'success', data: { id: userId, name: '张三' } }) } catch (err) { console.error(`[ERROR] 查询用户信息失败, userId=${userId}`, err) res.status(500).json({ code: 500, message: '查询失败', data: null }) } }) app.listen(3000, () => { console.log('server started at http://localhost:3000') })当请求GET /api/user/info?userId=0时,浏览器 Network 面板会看到 500,而后端控制台会打印[ERROR] 查询用户信息失败, userId=0以及异常堆栈。这时候就能确定是后端 BUG,而不是前端问题。
5.3 统一响应结构,让前后端边界更清晰
很多前后端“扯皮”源于响应结构不统一。比如接口出错时,有的返回{ code: 500 },有的直接返回一段 HTML,前端根本解析不了。建议后端统一响应格式。
{ "code": 0, "message": "success", "data": {} }当code为 0 时,表示业务成功;code非 0 时,表示业务失败或系统异常。前端可以根据code快速判断:
- 网络层错误:请求超时、断网、CORS 拦截。
- HTTP 状态码非 2xx:服务端或网关异常。
- HTTP 状态码 2xx 但
code非 0:后端业务逻辑主动返回的错误。
这一层约定能直接消灭大量“不知道这算谁的锅”的场景。
5.4 后端 BUG 判断清单
- 接口返回 404,检查后端路由是否注册、Nginx location 是否匹配,以及前端请求路径前缀是否正确。
- 接口返回 500,查看后端日志的异常堆栈,定位具体代码行。
- 接口返回 200 但业务字段值不合理,检查后端 SQL、计算逻辑、缓存逻辑。
- 接口返回的数据字段和前端对不上,检查后端实体类和字段映射,而不是急着改前端。
- 接口偶尔超时,检查数据库慢查询、第三方接口耗时、线程池阻塞。
6. 环境 BUG 的定位:代码没问题,配置和运行环境才是元凶
6.1 环境 BUG 的五个识别信号
- 同一套代码,在开发环境正常,在测试或生产环境异常。
- 本地启动正常,部署到服务器就报错。
- 换一台设备或换一个账号就恢复正常。
- 代码没有任何改动,但重启服务或清理缓存后问题自动消失。
- 报错信息提到了运行时、依赖包、权限、网络、配置等非业务概念。
只要命中两条以上,就建议先按环境 BUG 排查,别急着翻业务代码。
6.2 高频环境 BUG 类型与排查命令
运行时版本不一致
Node.js 项目版本差异很常见。比如本地用的 Node 18,服务器上装的是 Node 14,某些语法可能直接报SyntaxError: Unexpected token。排查命令:
node -v npm -v java -version mvn -v python --version把异常环境的版本和正常环境的版本放在一起对比。
依赖缺失或原生模块编译失败
收藏了很多 ComfyUI、机器学习工作流的朋友应该熟悉这种场景:加载工作流时提示“请安装缺失的节点/包”,其实不是代码逻辑坏了,而是当前 Python 环境缺少对应的第三方包。按提示执行:
pip install -u --pre comfyui-m或者在前端项目中,遇到Cannot find native binding之类的报错,通常和 npm 安装的依赖有关,常见原因是 Node.js 和 node-sass、bcrypt 这类原生模块版本不匹配。此时先清掉重新安装:
rm -rf node_modules rm -f package-lock.json npm installNginx 配置错误
Nginx 配置错误导致的 BUG 非常隐蔽。比如静态资源路径配置不对,页面加载时 HTML 正常,但 JS、CSS 返回 404,最终表现却是白屏。排查命令:
nginx -t tail -f /var/log/nginx/error.log重点看error.log里的路径和proxy_pass转发地址。
跨域拦截
跨域是一个典型的“表现像前端、根因在后端”的问题。浏览器 Network 面板中,你可能会看到请求返回 200,但同时 Console 报 CORS 错误。这就是响应被浏览器拦截了。解决办法是让服务端正确返回跨域头。
如果你们使用 Nginx,可以在配置中加上:
add_header Access-Control-Allow-Origin "*"; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, Authorization";注意:生产环境不建议用*,应该设置为具体域名。
环境变量不一致
很多项目会通过.env文件或环境变量区分数据库地址、Redis 地址、第三方密钥。如果某个环境加载了错误的配置,就会出现“接口能通但数据不对”“回调失败”“权限异常”等千奇百怪的现象。
先看当前运行环境加载了哪些变量:
env | grep APP_对比不同环境的配置差异,重点核对那些“只有某一个环境才存在”的变量。
6.3 环境 BUG 判断清单
- 先确认代码是不是最新版本,排除发布遗漏。
- 对比正常环境和异常环境的运行时版本、依赖版本。
- 检查 Nginx 转发规则和静态资源路径。
- 检查环境变量、配置文件是否被错误覆盖。
- 检查端口、防火墙、DNS 是否对当前网络环境开放。
- 检查 Docker 容器日志和宿主机的磁盘、内存使用情况。
7. 实战案例:四个典型“甩锅现场”拆解
案例一:点击按钮无响应,前端还是后端?
现象:用户点击“保存”按钮,页面没有任何反应,也不报错。
查证过程:
- 打开 Console,发现报错
Cannot read properties of undefined (reading 'name')。 - 打开 Network,发现请求根本没有发出去。
- 检查源码,发现按钮点击事件里访问了一个未定义变量的属性,导致后续逻辑中断。
结论:前端 BUG。按钮点击事件里抛出了 JS 异常,请求压根没发出。
修复方向:修复前端空对象判断,或确保数据初始化完整。
案例二:接口返回 500,前端还是后端?
现象:表单提交后,页面弹出“服务异常”。
查证过程:
- Network 面板看到
POST /api/order/create状态码为 500。 - 打开后端日志,发现一条
ERROR,内容是Table 't_order' doesn't exist。 - 查看数据库,发现
t_order表在测试环境被误删了。
结论:后端 BUG,更准确地说是“后端依赖的数据库环境异常”。
修复方向:恢复数据库表结构;后端代码加一个表结构初始化脚本或启动自检。
案例三:测试环境正常,生产环境白屏
现象:同一套代码部署到生产环境后,页面白屏,测试环境和本地都正常。
查证过程:
- Console 看到 JS 文件加载 404。
- 检查 Network,发现页面请求的 JS 路径是
/app/index.js,但生产环境静态资源实际在/static/js/下。 - 对比 Nginx 配置,发现生产环境的静态资源路径和测试环境不一致。
结论:环境 BUG。代码没问题,是 Nginx 静态资源路径配置和生产环境的发布路径不匹配。
修复方向:统一静态资源路径,或调整 Nginx root 配置。
案例四:模拟器正常,真机接口请求失败
现象:App 在模拟器里请求接口正常,换到 Android 真机上一直失败。
查证过程:
- 真机 Network 面板(或抓包工具)显示请求连接超时。
- 检查后端日志,根本没有收到请求。
- 确认真机访问的是内网地址还是公网地址;如果服务端是
localhost,真机自然连不上。 - 如果使用 HTTPS,还要检查真机是否安装了对应的根证书。
结论:环境 BUG。真机和模拟器的网络环境、证书信任环境不一致。
修复方向:真机改为访问局域网或公网地址,按需安装开发证书。
8. 团队协作中如何减少“前后端扯皮”
8.1 用接口文档代替口头沟通
前后端先约定接口契约,包括 URL、Method、请求参数、响应结构、错误码。后端按契约实现,前端按契约联调。接口文档可以用 Swagger、OpenAPI,或者低成本地使用 Apifox、Postman 的共享文档。
8.2 统一错误码和响应结构
建议至少约定以下错误码:
| code | 含义 | 前端处理建议 |
|---|---|---|
| 0 | 成功 | 正常展示数据 |
| 401 | 未登录或登录过期 | 跳转登录页 |
| 403 | 无权限 | 提示用户无权限 |
| 500 | 系统异常 | 统一弹“服务器开小差” |
| 10001 | 参数校验失败 | 按 message 提示 |
| 10002 | 业务校验失败 | 按 message 提示 |
前端不要因为接口返回了 HTTP 200 就认为一定成功,要判断code字段。
8.3 用 traceId 串联请求日志
一个请求可能经过 Nginx、后端服务、数据库,靠人工去翻每一层的日志很难。建议生成一个traceId,从入口开始携带,贯穿整个调用链。
// 文件路径:server/middleware/trace.js const { v4: uuidv4 } = require('uuid') function traceMiddleware(req, res, next) { req.headers['x-trace-id'] = req.headers['x-trace-id'] || uuidv4() res.setHeader('x-trace-id', req.headers['x-trace-id']) next() } module.exports = traceMiddleware后端日志里打印 traceId,前端响应头里也能看到 traceId。出问题时拿着 traceId 去日志平台搜索,几分钟就能定位到是哪个环节出了异常。
8.4 提单必须带“证据链”
测试和开发约定:提交 BUG 时至少包含以下内容。
- 复现步骤和复现环境。
- 浏览器 Console 报错截图。
- Network 面板请求信息截图(请求 URL、状态码、响应体)。
- 如果是数据问题,附上正确数据和实际数据的对比。
- 是否在其他环境正常。
只要证据链完整,绝大多数“归属争议”会在提单阶段就被解决。
8.5 让 BUG 生命周期中的归属结论可追溯
一个 BUG 从提交、分配给前端/后端、开发修复、测试验证,到最终关闭,应该记录最终定位的归属类型。建议每个迭代复盘时,把 BUG 分成“前端 BUG / 后端 BUG / 环境 BUG / 需求理解不一致”四类,统计占比。如果一个团队环境 BUG 占比超过三成,说明部署、配置或版本管理存在系统性问题,需要优先治理环境而不是继续打地鼠。
9. 常见问题与排查速查表
| 问题现象 | 可能归属 | 第一排查手段 |
|---|---|---|
| 页面白屏 | 前端 / 环境 | 打开 Console 看 JS 报错;检查 JS/CSS 是否 404 |
| 点击按钮无反应 | 前端 | Console 是否有报错;Network 请求是否发出 |
| 接口返回 500 | 后端 | 查后端日志异常堆栈 |
| 接口返回 502 | 环境 / 部署 | 确认后端服务是否启动;检查 Nginx 与后端的连接 |
| 接口返回 404 | 后端 / 环境 | 检查后端路由;检查 Nginx 转发路径 |
| 控制台报 CORS 错误 | 后端 / 环境 | 查看响应头是否有 Access-Control-Allow-Origin |
| 测试环境正常,生产环境异常 | 环境 | 对比 Nginx 配置、静态资源路径、环境变量 |
| 本地正常,服务器异常 | 环境 | 对比运行时版本和依赖安装情况 |
| 接口正常,页面数据不正确 | 前端 | 打断点跟进数据处理和渲染逻辑 |
| 低版本浏览器异常 | 前端 | 检查使用了高版本语法或 API 不兼容 |
10. 最佳实践与工程建议
10.1 前端侧
- 统一封装请求库,在拦截器里处理 HTTP 状态码、业务错误码、网络超时,避免每个页面各写一套判断逻辑。
- 给打包产物开启 Source Map,同时配合前端监控平台收集线上 JS 错误。白屏和点击无响应这类问题,只靠用户反馈很难定位,有了 Source Map 和错误上报,很多前端 BUG 可以在用户没感知时就被发现。
- 避免在渲染函数中做复杂计算或深度访问没有兜底的对象属性。
- 发布前对比打包产物的静态资源引用路径,避免部署后静态资源路径不一致。
10.2 后端侧
- Controller 层必须有全局异常处理,避免把原始堆栈直接抛给前端接口。
- 日志内容要完整,至少要包含:入参、出参、耗时、traceId。没有日志的接口,出了问题就是“盲人摸象”。
- 数据库操作加慢 SQL 日志,方便快速发现索引缺失和全表扫描问题。
- 接口参数校验要在后端做一遍,不能完全依赖前端。
- 响应结构必须稳定,字段命名一旦发布给前端,不要随意修改。
10.3 环境与配置侧
- 用 Docker 或 CI 构建产物来统一运行环境,减少“本地正常、服务器异常”的概率。
- 配置通过环境变量或配置中心统一管理,避免把测试环境地址写死在代码里。
- 多环境部署前,制作一个配置对比清单,包括数据库、Redis、静态资源路径、API 域名、Nginx 转发规则。
- 任何生产变更都要有回滚方案,先备份再操作,涉及数据库结构的变更先在预发环境验证。
11. 最后说点实在的
遇到 BUG 先别急着解释,也别急着改代码。花三分钟把证据收集齐:Console 有没有报错,Network 里请求有没有发出去,响应状态码是多少,响应体是什么,后端日志有没有异常。这五样东西看完,前端 BUG、后端 BUG、环境 BUG 的责任边界基本就浮出水面了。
如果查完这些还分不清,大概率不是“谁的锅”的问题,而是团队缺少统一的接口规范、日志规范和环境管理制度。把规范补上,比单独修好某个 BUG 更重要。下次再遇到三方扯皮,不妨先把这两句话甩出去:口说无凭,请求日志为证;先查环境,再谈代码。