引言
排查 bug 就像破案,报错信息是唯一的线索,可惜这线索有时候不太靠谱。
你以为它在给你带路,结果它其实是那个举着假路牌、还一本正经指错方向的路痴。
- 报 “文件不存在”?别太快信——其实你只是没给权限,它连门都进不去。
- 报 “跨域”?别急着骂浏览器——后端压根就没启动,跨个寂寞。
报错信息啊,就像个嘴硬的嫌疑人,问什么都不正面回答,偏偏还得靠它破案。
所以程序员查 bug,得像老刑警一样——多点怀疑,别被“伪证”带跑偏了!
本文带你盘一盘那些表面一本正经、实则“满嘴跑火车”的报错信息,帮你认清它们的真面目,别再被耍得团团转。
1. 明明是 404,浏览器却报跨域
-
报错是这样:
No 'Access-Control-Allow-Origin' header present. -
实际真相:
你请求的接口压根没部署上线,或者你手抖路径写错了。Nginx一看没人处理,就甩你一个“标准404 HTML”,没带 CORS 头,浏览器傻傻地以为你越界了。 -
示例剧情:
你请求的是http://api.example.com/data,但服务器压根没这个接口。结果 Nginx 默默回你一个 HTML 错误页,你还傻傻地response.json(),直接砸锅。 -
正确姿势:
用 Postman 或 curl 看看到底回了啥,别被浏览器骗惨了。
2. 明明文件存在,却报文件不存在
-
报错信息:
error: cannot spawn .husky/prepare-commit-msg: No such file or directory -
幕后黑手:
文件确实在,只是你没给它“演出资格证”(执行权限)。Linux:不加chmod +x,我不让它出场。 -
解法:
chmod +x .husky/prepare-commit-msg给它一张通行证即可。
3. HTTPS 请求被拦截,却报连接超时
-
报错信息:
ERR_CONNECTION_TIMED_OUT或NetworkError -
真相大白:
TLS 握手直接被黑科技拦下,证书不对劲,浏览器懵了:不如我装傻,说超时吧。 -
侦破办法:
curl -v https://api.example.com看看是不是 SSL 阶段就 GG 了。
4. 你以为变量没定义,其实是路径大小写犯事了
-
报错长这样:
ReferenceError: myVar is not defined -
真相惊人:
你在 Windows 上开发,一切风平浪静;部署到 Linux 上,大小写敏感突然爆炸——你写了./Config,人家文件是./config啊喂! -
幕后机制揭秘:
构建工具图省事搞了个空模块,变量没定义,结果锅背给了ReferenceError,背得还挺委屈。
5. JSON.parse 一下爆炸,结果吃进了 <html>
-
爆炸提示:
SyntaxError: Unexpected token '<' -
真谜底:
你以为接口会乖乖给你返回 JSON,结果对方甩你一张 HTML 报错页——<html>开头那种。你一个JSON.parse()下去,JavaScript parser 瞬间傻眼:“我让你喂我牛排,你给我一张报纸?”
-
破解方式:
不要上来就.json(),先.text()打开盖子看看,确认真的是 JSON,再动筷子。
6. 数据库说“密码不对”,你明明没输错!
-
报错:
FATAL: password authentication failed for user "myuser" -
真相其实是:
密码没毛病,数据库根本没理你:- 它没开门(服务没启动)
- 你根本敲不到门(防火墙挡住了)
- 你不在它的社交圈(IP 没加白名单)
-
探测法宝:
# 旧指令 telnet db.example.com 5432 # 新指令 nc -zv db.example.com 5432
7. npm ERR! code ELIFECYCLE 看起来像诅咒,其实它在暗示你“你项目炸了”
-
常见祭文:
npm ERR! code ELIFECYCLE npm ERR! my-app@1.0.0 start: `node app.js` -
原因五花八门:
- app.js 写得像坨 💩
- 环境变量全靠缘分
- 端口早就被占了
- 权限都不给,还想运行?
-
灵魂建议:
--verbose!让 npm 把话说清楚:npm run start --verbose
8. git show 突然说你“HEAD detached”,听起来像你断了根,其实是 Git 提醒你:你飘了
-
提示:
HEAD detached at abc1234 -
含义其实是:
你 check 到了一个 commit 或 tag,现在是自由人,不属于任何分支。 -
解围姿势:
想继续搞事就建个新分支吧:git checkout -b new-feature
9. 明明全程 HTTPS,却 Mixed Content 报警!
-
警报声:
Mixed Content: 请求了一个不安全资源 'http://api.example.com/data' -
犯错的不是你,是后端或者配置:
- 页面 HTTPS,接口却 HTTP
- 后端生成链接时没用协议头
X-Forwarded-Proto
-
修复方法:
- 换成 HTTPS 接口
- 后端别瞎生成 HTTP 链接
10. POST 请求说不允许,其实是你 OPTIONS 不处理
-
报错:
405 Method Not Allowed -
幕后大戏:
浏览器好心做预检,发了个 OPTIONS,后端一脸懵逼:啥玩意?然后报了 405。 -
怎么办?
后端你得学会接待 OPTIONS 请求,回个 200 再说:Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, OPTIONS
11. Vue 项目报 Cannot find module 'vue-template-compiler'
-
真相:
你vue是 2.x,vue-template-compiler也应该是2.x.x,版本对不上,当然打架了! -
解决方法:
npm install vue@2.x.x vue-template-compiler@2.x.xVue 3 不再使用该模块,而是
@vue/compiler-sfc
12. 本地跑报证书无效,线上却一切 OK?
-
报错姿势:
NET::ERR_CERT_AUTHORITY_INVALID -
真相反转:
你以为浏览器太挑剔,其实是公司代理在你的 HTTPS 流量里偷偷撒了料 ——用上了自签名证书拦截加密请求,美其名曰“安全审计”,实则“全程监控”。你的浏览器一看:
“这是谁颁的证书?我不认识,打回重签!”
-
破解方式:
- 去 IT 部门拿一份“官方认证”的根证书,手动导入系统或浏览器;
- 或者干脆——绕过代理,走直线;
- 实在不行,就在开发环境忽略证书(不推荐,危险行为请在大人陪同下操作)。
13. pnpm 明明在家,却说“找不到我”?
-
表面现象:
系统理直气壮地跟你说:bash 复制编辑 Error: Cannot find module '../dist/pnpm.cjs' Require stack: - /home/jenkins/.nvm/versions/node/v18.20.6/bin/pnpm你一脸问号:我都看见你了,怎么你还说你自己不存在?
-
真相反转:
这不是“你看得见我但我感受不到我自己”的玄学,而是 pnpm 虽然装上了,但魂丢了。常见幕后黑手有三位:
- Jenkins 缓存作妖:老旧文件、CI 缓存残留把你的安装覆盖得七零八落;
- 手欠党手动改动路径:你自己或者某个神秘脚本偷偷动了
/bin/pnpm的文件位置; - nvm 安装中途翻车:
nvm install没装完,但系统以为你已经准备就绪。
-
破解方式:
- 彻底删除坏掉的 Node 环境或 CI 工作目录;
- 重新执行
nvm install和pnpm install -g pnpm; - 把 Jenkins 的
node_modules/.bin/pnpm路径确认干净,没有被污染。
简而言之:
pnpm 不是没装,而是被你装坏了。
总结
程序员和报错之间的关系,说白了就是一段 长期共事 + 案发现场勘察 的故事。
你以为它对你说“文件不存在”,其实它在心里说:“权限都不给我,我怎么帮你干活?”
你以为它说“跨域”,其实它在旁边冷笑:“你连服务都没起。”
所以啊—— 看报错,别光盯字面,得像侦探破案一样,质疑一切,抽丝剥茧,还原真相。
报错永远不会说谎,但它确实常常讲“部分事实”——剩下的,就靠你像柯南一样,把细节拼起来!
希望这篇“报错鉴伪指南”能帮你:
- 少挨一点骂
- 少掉一些头发
- 早点回家刷抖音!