1. DeprecationWarning(API过时警告)
示例日志:(node:1234) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues.
原因分析:代码或依赖的npm包使用了Node.js废弃的API(如Buffer()构造函数),这类API可能存在安全漏洞或不符合最新规范。
解决方案:
node -v确认当前版本,使用sudo n latest(或sudo apt update && sudo apt install -y nodejs)升级到最新稳定版,新版本通常会修复废弃API并优化性能。Buffer()替换为Buffer.alloc()(安全初始化缓冲区)或Buffer.from()(从现有数据创建缓冲区)。npm outdated查看过时的依赖包,使用npm update更新到最新版本,或通过npm install package-name@latest单独升级特定包。2. UnhandledPromiseRejectionWarning(未处理的Promise拒绝)
示例日志:(node:5678) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Connection failed
原因分析:Promise链中未添加.catch()处理错误,或async/await未用try-catch包裹,导致异步操作失败时错误被忽略,可能引发后续逻辑异常。
解决方案:
.catch()方法:为每个Promise链添加错误处理,例如myAsyncFunction().catch(err => console.error("Error:", err));。try-catch包裹async/await:在异步函数内部用try-catch捕获错误,例如:async function fetchData() {
try {
let data = await getData();
console.log(data);
} catch (err) {
console.error("Error fetching data:", err);
}
}
app.js)添加全局监听器,临时捕获未处理的拒绝(需配合日志记录):process.on("unhandledRejection", (reason, promise) => {
console.error("Unhandled Promise Rejection:", reason);
});
3. MaxListenersExceededWarning(监听器泄漏警告)
示例日志:(node:7890) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit
原因分析:事件监听器未正确清除(如重复调用on()添加监听器、未调用removeListener()),导致内存泄漏(默认最大监听器数为10)。
解决方案:
EventEmitter的最大监听器数(不推荐长期使用),例如:const EventEmitter = require("events");
EventEmitter.defaultMaxListeners = 20; // 全局设置
// 或针对特定实例设置
const myEmitter = new EventEmitter();
myEmitter.setMaxListeners(20);
removeListener()或off()中指定要移除的函数,例如:function handler() { console.log("Event triggered"); }
myEmitter.on("eventName", handler);
// 不再需要时移除
myEmitter.removeListener("eventName", handler);
once()替代on():对于只需触发一次的事件(如HTTP请求响应),使用once()自动移除监听器,避免重复添加。4. ENOMEM/Memory Limit Error(内存不足警告)
示例日志:FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
原因分析:Node.js默认内存限制(约1.7GB)不足以处理大量数据(如大数组、未释放的对象),或代码存在内存泄漏(如全局变量缓存未清理)。
解决方案:
--max-old-space-size标志调整堆内存大小(单位:MB),例如:node --max-old-space-size=4096 your-app.js # 设置为4GB
clinic工具定位泄漏源,例如:npm install -g clinic
clinic doctor -- node your-app.js # 生成分析报告
global.cache = {})、使用流(Stream)处理大文件(避免一次性加载到内存)、减少闭包的使用(防止变量无法被GC回收)。5. Port Already in Use(端口被占用警告)
示例日志:Error: listen EADDRINUSE: address already in use :::3000
原因分析:应用尝试监听的端口(如3000)已被其他进程占用(可能是之前的Node.js进程未完全退出,或其他服务占用了该端口)。
解决方案:
lsof -i :3000(替换为实际端口),查看PID(进程ID)。kill -9 <PID>强制终止进程(如kill -9 1234),然后重启应用。app.listen())使用其他端口(如3001)。6. Module Not Found(模块未找到警告)
示例日志:Error: Cannot find module 'express'
原因分析:代码中引用的模块未安装(如npm install遗漏),或模块路径错误(如require('./wrong-path'))。
解决方案:
npm install missing-module(如npm install express),确保package.json中的dependencies包含所需模块。require()中的路径正确(如相对路径./utils/helper是否存在,绝对路径/usr/local/module是否有效)。node_modules目录损坏,删除后重新安装:rm -rf node_modules package-lock.json
npm install
7. SyntaxError/ReferenceError/TypeError(语法/引用/类型错误)
示例日志:
SyntaxError: Unexpected token '{'(语法错误:缺少括号或逗号)ReferenceError: variable is not defined(引用错误:变量未声明)TypeError: Cannot read property 'name' of undefined(类型错误:访问未定义对象的属性)console.log(undefinedVar))、类型不匹配(如"123" + 456应为Number("123") + 456)。let或const声明变量(如let variable = 10;),避免隐式全局变量。typeof验证变量类型(如if (typeof obj !== 'undefined')),或使用Optional Chaining(obj?.name)避免访问未定义属性。