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標志調整堆內存大?。▎挝唬篗B),例如: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)避免訪問未定義屬性。