1. 语法错误(SyntaxError)
语法错误是代码不符合JavaScript语法规则导致的,常见表现包括缺少括号、引号、逗号,或使用了未定义的关键字。例如:console.log('Hello, world'(缺少闭合括号)。这类错误会在代码解析阶段被捕获,日志中会明确指出错误行号,解决方法需仔细检查代码语法。
2. 引用错误(ReferenceError)
当尝试访问未定义的变量或函数时触发,例如:console.log(undefinedVar)(undefinedVar未声明)。解决方法需确认变量/函数名拼写正确,或在访问前正确定义。
3. 类型错误(TypeError)
对不支持的操作执行不合法操作时发生,例如:null.property(访问null对象的属性)、'123' + 456(字符串与数字相加未转换类型)。日志中会提示具体非法操作,解决方法需检查变量类型并进行适当转换(如用Number()转换字符串为数字)。
4. 端口占用错误(EADDRINUSE)
当Node.js应用尝试绑定已被其他进程占用的端口时触发,例如:listen EADDRINUSE :::3000(端口3000已被占用)。日志中会明确端口信息,解决方法需通过lsof -i :PORT查找占用进程并终止(kill -9 PID),或更改应用端口号。
5. 文件/目录不存在错误(ENOENT)
尝试访问不存在的文件或目录时发生,例如:ENOENT: no such file or directory, open '/path/to/file'。常见场景包括文件路径拼写错误、文件未上传或目录被删除。解决方法需检查路径正确性,确保文件/目录存在。
6. 权限错误(EACCES)
当应用没有足够权限执行操作时触发,例如:EACCES: permission denied, open '/var/log/node.log'(无权限写入日志文件)、EACCES: permission denied, bind to port 80(非root用户绑定80端口)。解决方法需修改文件/目录权限(chmod)或使用sudo提升权限(注意:生产环境避免直接用root)。
7. 连接错误(ECONNREFUSED/ECONNRESET/ETIMEDOUT)
ECONNREFUSED connect ECONNREFUSED 127.0.0.1:3306(MySQL服务未启动)。ping/telnet测试),或增加连接超时时间(如axios的timeout配置)。8. 内存溢出错误(RangeError/MemoryLimitError)
当应用消耗内存超过限制时触发,例如:RangeError: Maximum call stack size exceeded(递归过深)、FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory(堆内存不足)。常见于大数据处理、无限递归或内存泄漏。解决方法需优化代码(如分批次处理数据、避免内存泄漏)、增加Node.js内存限制(--max-old-space-size=4096,单位MB)。
9. 超时错误(TimeoutError/ERR_TIMEOUT)
异步操作(如HTTP请求、数据库查询)超过预定时间未完成时触发,例如:ERR_TIMEOUT: Request timeout(请求超时)。解决方法需优化操作性能(如增加数据库索引、减少请求数据量),或调整超时设置(如axios的timeout、http模块的timeout选项)。
10. 未处理的异常(UnhandledPromiseRejection/UncaughtException)
未捕获的Promise拒绝或未处理的异常会导致应用崩溃,日志中会显示UnhandledPromiseRejectionWarning或Uncaught Exception信息。例如:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'name' of undefined(未处理Promise中的类型错误)。解决方法需用try/catch捕获异步操作错误,或通过process.on('unhandledRejection')、process.on('uncaughtException')全局捕获并处理(避免应用退出)。