温馨提示×

如何看懂nodejs崩溃日志

小樊
38
2026-09-05 16:33:17
栏目: 编程语言

看懂 Node.js 崩溃日志,可以按“先看结论 → 再找堆栈 → 分析上下文 → 定位代码”的顺序来。下面用实用方式讲清楚。


一、崩溃日志通常长什么样

一个典型的 Node.js 崩溃日志示例:

node:internal/process/promises:288
    triggerUncaughtException(err, true /* fromPromise */);
    ^

Error: something went wrong
    at foo (/app/index.js:10:15)
    at bar (/app/index.js:6:3)
    at Object.<anonymous> (/app/index.js:2:1)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)

二、崩溃日志的 5 个关键部分

1️⃣ 错误类型(最重要)

Error: something went wrong
TypeError: Cannot read properties of undefined
RangeError: Maximum call stack size exceeded

常见类型:

类型 含义
Error 通用错误
TypeError 类型不对(最常见)
ReferenceError 变量未定义
RangeError 栈溢出 / 参数越界
SyntaxError 代码写错(一般启动就崩)

2️⃣ 错误消息(看不懂就看堆栈)

Cannot read properties of undefined (reading 'name')

翻译一下:

你访问了 undefined.name


3️⃣ 堆栈追踪(Stack Trace)

at foo (/app/index.js:10:15)
at bar (/app/index.js:6:3)

含义:

  • foo 是在 index.js 第 10 行调用的
  • bar 调用了 foo
  • 最上面一行 = 崩溃发生点

✅ 重点看 第一行你的代码


4️⃣ Promise / Async 错误

如果是异步错误,常见形式:

UnhandledPromiseRejectionWarning

说明:

  • Promise 抛错没人 catch
  • Node 默认会崩溃(尤其 Node 15+)

✅ 解决方式:

process.on('unhandledRejection', e => {
  console.error(e);
});

5️⃣ Native / C++ 层崩溃(难搞)

SIGSEGV
Segmentation fault

说明:

  • 不是 JS 层问题
  • 可能是:
    • native 模块(bcrypt、sharp)
    • 内存损坏
    • Node 版本不兼容

三、快速定位问题的套路

✅ 第一步:看有没有 at 你的文件

at UserService.getUser (/src/user.js:25:10)

直接打开那一行。


✅ 第二步:问自己 3 个问题

  1. 这个变量哪来的?
  2. 它可能是 undefined 吗?
  3. 是不是异步没 await

✅ 第三步:加日志(最简单有效)

console.log(JSON.stringify(data));

四、常见崩溃 & 含义速查

日志 原因
Cannot read property of undefined 没判空
await is only valid in async 函数没 async
ECONNRESET 网络断了
ETIMEDOUT 请求超时
Maximum call stack 递归没退出

五、让日志更好看的技巧

✅ 用 source-map(TS / 打包后)

Error.prepareStackTrace

✅ 用结构化日志

console.error({
  msg: 'db error',
  err
});

✅ 用错误监控

  • Sentry
  • PM2 + logs
  • nestjs / express 中间件

六、你可以这样练

如果你愿意:

  • 贴一段真实崩溃日志
  • 或说你是 前端 / 后端 / 脚本
  • 或用的 框架(Express / Nest / Koa)

我可以直接帮你逐行翻译成人话

0