Node.js日志中常见错误及解决方法
错误表现:启动服务器时抛出Error: listen EADDRINUSE: address already in use :::3000,提示指定端口(如3000)已被其他进程占用。
解决方法:
lsof -i :3000命令查找占用端口的进程ID(PID),再用kill -9 <PID>终止该进程;app.listen(port)参数。错误表现:运行时抛出Error: Cannot find module 'xxx',提示无法找到指定的模块(如express、lodash或本地文件)。
解决方法:
npm install xxx安装缺失的模块;require('./utils/helper'))。错误表现:代码存在语法问题,抛出SyntaxError(如缺少括号、引号不匹配、使用了ES6语法但未启用babel)。
示例:console.log('Hello, World!'(缺少右括号)。
解决方法:
babel配置支持ES6+)。错误表现:使用未定义的变量时抛出ReferenceError(如变量名拼写错误、变量未声明)。
示例:console.log(undefinedVar)(undefinedVar未定义)。
解决方法:
let undefinedVar = 'value';)。错误表现:尝试调用非函数类型的值时抛出TypeError(如将字符串、对象当作函数调用)。
示例:const result = 'hello'()(字符串'hello'不是函数)。
解决方法:
typeof target === 'function');computeHash是否拼写错误)。错误表现:未处理的异常导致应用崩溃,抛出Uncaught Exception(如异步代码中的错误未被捕获)。
解决方法:
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err);
process.exit(1); // 强制退出进程,避免应用处于不稳定状态
});
try-catch捕获同步代码中的异常,异步代码使用async/await或.catch()处理。错误表现:应用消耗过多内存,抛出JavaScript heap out of memory,提示内存超出默认限制(通常为1.4GB~2GB)。
解决方法:
heapdump、clinic.js)定位内存泄漏(如未释放的缓存、闭包中的大对象);--max-old-space-size参数(如node --max-old-space-size=4096 app.js,将内存限制提升至4GB)。错误表现:尝试访问不存在的文件或目录时抛出ENOENT: no such file or directory(如读取日志文件、配置文件失败)。
解决方法:
path.join(__dirname, 'logs/app.log')构建跨平台路径);fs.mkdirSync(path, { recursive: true })递归创建目录)。错误表现:尝试写入日志文件、绑定端口或访问系统资源时抛出EACCES: permission denied(如Linux系统下普通用户绑定80端口)。
解决方法:
chmod(修改权限)或chown(修改所有者)命令调整(如sudo chown -R $USER:$USER /var/log/nodejs);sudo node app.js,但不推荐长期使用,建议配置正确的权限);错误表现:处理流(如文件流、HTTP请求流、Socket流)时,未捕获的流错误导致应用崩溃(如文件读取失败、网络连接中断)。
解决方法:
error事件处理程序,捕获并处理流中的错误:const fs = require('fs');
const readStream = fs.createReadStream('nonexistent.txt');
readStream.on('error', (err) => {
console.error('Stream Error:', err);
});
error监听器)。