盘点那些误导新手的报错

563 阅读6分钟

引言

排查 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_OUTNetworkError

  • 真相大白:
    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.x
    

    Vue 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 虽然装上了,但魂丢了

    常见幕后黑手有三位:

    1. Jenkins 缓存作妖:老旧文件、CI 缓存残留把你的安装覆盖得七零八落;
    2. 手欠党手动改动路径:你自己或者某个神秘脚本偷偷动了 /bin/pnpm 的文件位置;
    3. nvm 安装中途翻车nvm install 没装完,但系统以为你已经准备就绪。
  • 破解方式

    1. 彻底删除坏掉的 Node 环境或 CI 工作目录;
    2. 重新执行 nvm installpnpm install -g pnpm
    3. 把 Jenkins 的 node_modules/.bin/pnpm 路径确认干净,没有被污染。

    简而言之:
    pnpm 不是没装,而是被你装坏了。

总结

程序员和报错之间的关系,说白了就是一段 长期共事 + 案发现场勘察 的故事。

你以为它对你说“文件不存在”,其实它在心里说:“权限都不给我,我怎么帮你干活?”
你以为它说“跨域”,其实它在旁边冷笑:“你连服务都没起。”

所以啊—— 看报错,别光盯字面,得像侦探破案一样,质疑一切,抽丝剥茧,还原真相。

报错永远不会说谎,但它确实常常讲“部分事实”——剩下的,就靠你像柯南一样,把细节拼起来!

希望这篇“报错鉴伪指南”能帮你:

  • 少挨一点骂
  • 少掉一些头发
  • 早点回家刷抖音!