解读 Node.js 错误日志,核心目标是:定位“在哪里出错、为什么出错、如何复现和修复”。下面从「日志结构 → 常见错误类型 → 解读方法 → 实战示例 → 排查工具」系统讲一下。
一个典型的 Node.js 错误日志示例:
TypeError: Cannot read properties of undefined (reading 'name')
at getUser (/app/user.js:12:15)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
关键信息:
TypeErrorCannot read properties of undefinedgetUser/app/user.js:12:15SyntaxError: Unexpected token 'export'
ReferenceError: req is not defined
TypeError: user.getName is not a function
nullRangeError: Maximum call stack size exceeded
UnhandledPromiseRejectionWarning: Error: DB connection failed
catchError: listen EADDRINUSE: address already in use :::3000
ERR_MODULE_NOT_FOUND)| 类型 | 重点 |
|---|---|
| SyntaxError | 语法 / 配置 |
| TypeError | 数据结构 |
| ReferenceError | 作用域 |
| ERR_* | Node 环境 |
不是最下面,是最上面你写的代码
at getUser (/app/user.js:12:15) ← 看这里
Node 内部代码可以忽略:
at processTicksAndRejections
例如:
const name = user.profile.name;
报错:
Cannot read properties of undefined (reading 'profile')
→ user 存在,但 profile 是 undefined
Promise / asyncUnhandledPromiseRejection
说明:
try/catch.catch()TypeError: Cannot read properties of undefined (reading 'id')
at getUserById (/service/user.js:20:22)
解读:
req.params 或数据库返回为 undefinedif (!user) throw new Error('User not found');
Error: listen EADDRINUSE: address already in use :::3000
解读:
lsof -i:3000
kill -9 <pid>
UnhandledPromiseRejectionWarning: Error: timeout
修复:
async function main() {
try {
await fetchData();
} catch (e) {
logger.error(e);
}
}
logger.error({
event: 'user_query_failed',
userId,
error: err.message
});
console.error(err.stack);
process.on('unhandledRejection', e => {
console.error('Unhandled:', e);
});
| 工具 | 用途 |
|---|---|
node --trace-warnings |
Promise 警告 |
ndb / node --inspect |
断点调试 |
winston / pino |
日志管理 |
sentry |
错误聚合 |
Node.js 错误日志 = 错误类型 + 最上层业务 stack + 上下文数据
如果你愿意,可以把具体的错误日志贴出来,我可以直接帮你“逐行解读 + 给出修复方案”。