16 个 Node.js 常见错误速查与修复指南

Heap OOM、ECONNRESET、EADDRINUSE……本文汇总 16 个 Node.js 高频错误的成因与修复方案,附生产环境错误处理实践,收藏级速查手册。

最佳实践
事件循环与异步任务流转插画

Node.js 高频错误分四类:内存类(Heap OOM→查泄漏或调 --max-old-space-size)、网络类(ECONNRESET/ETIMEDOUT→重试与超时配置)、端口类(EADDRINUSE→换端口或杀占用进程)、文件类(ENOENT→检查路径与权限)。生产环境靠统一错误处理与监控告警兜底。

内存类

1. Heap Out of Memory(JavaScript heap out of memory)

V8 堆超限崩溃。排查:是否内存泄漏(见本系列《内存泄漏防治指南》);短期缓解:node --max-old-space-size=4096 app.js。容器部署注意该值要小于容器内存上限。

网络类

2. ECONNRESET:对端强制断开。常见于:下游服务重启、代理空闲超时。处理:请求库配置重试(指数退避),服务端检查 keep-alive 超时与代理超时的匹配。

3. ENOTFOUND:DNS 解析失败——域名拼错、DNS 配置错误、或目标域名确实不存在。

4. ETIMEDOUT:连接超时——网络不通、防火墙拦截、目标过载。所有外部调用必须设超时(axios 的 timeout、fetch 的 AbortSignal.timeout)。

5. ECONNREFUSED:连接被拒绝——目标端口没有服务在听。检查:服务是否启动、端口是否正确、容器端口映射。

8. ECONNABORTED:客户端中途放弃(浏览器取消请求)。服务端应把它当正常事件处理而非错误告警。

9. EHOSTUNREACH / 10. EAI_AGAIN:路由不可达 / DNS 临时失败——多为基础设施层抖动,重试机制是标准答案。

端口与地址类

6. EADDRINUSE:端口被占用。lsof -i :3000 找到占用进程;开发期常见于上一个进程没退干净。生产上用进程管理器避免双实例。

7. EADDRNOTAVAIL:绑定了一个本机不存在的 IP(服务器换 IP 后配置没更新)。

文件系统类

11. ENOENT:文件/目录不存在——相对路径陷阱(工作目录变了路径就错),用 path.join(__dirname, ...) 锚定。

12. EISDIR / 13. ENOTDIR:把目录当文件读 / 路径中间某段不是目录——路径拼接逻辑检查。

14. EACCES / 16. EPERM:权限不足。别用 root 跑应用掩盖问题——给应用用户精确授权才是正解。

15. EEXIST:创建已存在的文件/目录——mkdir 加 { recursive: true },文件操作先判断存在性。

生产环境的错误治理

// 全局兜底:未捕获异常与未处理 Promise 拒绝
process.on('uncaughtException', (err) => {
  logger.fatal({ err }, '未捕获异常,进程即将退出');
  process.exit(1);  // 记录后退出,让进程管理器重启——状态未知的进程不可信
});

process.on('unhandledRejection', (reason) => {
  logger.error({ reason }, '未处理的 Promise 拒绝');
});

常见问题(FAQ)

Q:遇到陌生错误码怎么查?

Node.js 错误码体系在官方文档有完整列表(搜索 "Node.js errors")。errno 体系源自 Unix——理解 syscall 层的语义,错误码就不再神秘。

Q:uncaughtException 里该做什么?

只做两件事:记录日志(同步方式,异步可能完不成)、优雅退出。不要在里面"恢复继续跑"——未捕获异常后的进程状态不可信。

Q:如何减少网络类错误的影响?

三件套:所有外部调用设超时、失败重试带指数退避与熔断、关键路径有降级方案。配合监控把网络错误率纳入 SLI。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台