1. 端口沖突(Error: listen EADDRINUSE :::3000)
原因:應用程序嘗試綁定的端口(如3000)已被其他進程占用,常見于多應用共存或進程未正常關閉的場景。
解決方法:
lsof -i :3000
命令查找占用端口的進程ID(PID),再用kill -9 <PID>
終止該進程;app.listen(3000)
改為const port = process.env.PORT || 3001; app.listen(port)
),避免端口沖突。2. 依賴模塊未找到(Error: Cannot find module ‘xxx’)
原因:項目依賴的模塊未安裝(如首次運行未執行npm install
),或node_modules
目錄被誤刪除。
解決方法:
npm install xxx
安裝缺失的模塊;npm install
安裝package.json
中定義的所有依賴,確保依賴完整性。3. 語法錯誤(SyntaxError: Unexpected token)
原因:代碼中存在語法錯誤(如缺少括號、引號、拼寫錯誤),導致Node.js無法解析代碼。
解決方法:
const x = { name: 'John'
補全為const x = { name: 'John' };
)。4. 未捕獲的異常(Error: Uncaught Exception)
原因:同步代碼中拋出的異常未被try-catch
捕獲,或異步操作(如Promise、回調函數)中的錯誤未被處理,導致應用程序崩潰。
解決方法:
try-catch
塊(如try { riskyOperation(); } catch (err) { console.error('Caught error:', err); }
);process.on('uncaughtException', (err) => { console.error('Uncaught exception:', err); process.exit(1); })
);.catch()
或async/await
的try-catch
)。5. 未處理的Promise拒絕(UnhandledPromiseRejectionWarning)
原因:Promise被拒絕(如reject()
或拋出錯誤),但未通過.catch()
或async/await
的try-catch
處理,可能導致內存泄漏或意外行為。
解決方法:
.catch()
(如someAsyncFunction().catch(err => console.error('Promise rejected:', err))
);async/await
時,用try-catch
包裹異步代碼(如async function run() { try { await someAsyncFunction(); } catch (err) { console.error('Error:', err); } }
);process.on('unhandledRejection', (reason, promise) => { console.error('Unhandled rejection:', reason); })
)。6. 文件或目錄不存在(Error: ENOENT: no such file or directory)
原因:應用程序嘗試訪問的文件或目錄不存在(如配置文件路徑錯誤、上傳目錄未創建),或路徑拼寫錯誤。
解決方法:
ls /path/to/file
);path.join(__dirname, 'relative/path')
構建跨平臺兼容的路徑(避免硬編碼/
或\
);mkdir -p /path/to/directory
創建目錄(如上傳目錄)。7. 權限不足(Error: Permission denied)
原因:Node.js進程沒有足夠的權限訪問文件、目錄或端口(如綁定1024以下端口需要root權限,或日志目錄無寫入權限)。
解決方法:
sudo
可能導致安全問題),改為用普通用戶運行;chmod +x script.js
賦予執行權限,chmod -R 755 logs/
賦予日志目錄寫入權限);8. Node.js版本兼容性問題
原因:應用程序依賴的模塊或代碼需要特定版本的Node.js(如舊模塊不支持Node.js 18+),導致運行錯誤。
解決方法:
node -v
檢查當前Node.js版本,確認是否符合應用要求;n
或nvm
(Node Version Manager)切換版本(如sudo apt install n
,然后sudo n 16
切換到Node.js 16);npm update
),確保模塊支持當前Node.js版本。9. 內存溢出(Error: Memory Limit Exceeded / JavaScript heap out of memory)
原因:應用程序消耗過多內存(如處理大文件、內存泄漏),超過Node.js默認的1.4GB內存限制(64位系統)。
解決方法:
--max-old-space-size
標志增加內存限制(如node --max-old-space-size=4096 app.js
將內存限制提升至4GB);node --inspect
配合Chrome DevTools,或clinic.js
工具),找出內存泄漏點(如未釋放的緩存、無限循環);10. 流未處理的異常(Stream Unhandled Error)
原因:流(如文件流、HTTP請求流、Socket流)操作中發生錯誤(如文件讀取失敗、網絡中斷),未附加錯誤處理程序導致進程崩潰。
解決方法:
error
事件處理程序(如const stream = fs.createReadStream('file.txt'); stream.on('error', (err) => { console.error('Stream error:', err); })
);try-catch
包裹同步流操作(如fs.readFileSync
),捕獲可能的錯誤;process.on('uncaughtException')
作為最后防線)。