在Node.js应用程序中,日志是诊断问题和监控应用程序运行状况的重要工具。以下是一些常见的Node.js日志错误及其解决方法:
1. Error: listen EADDRINUSE: address already in use :::3000
原因: 端口3000已经被其他进程占用。 解决方法:
- 找出占用端口的进程并终止它:
lsof -i :3000 kill -9
- 更改应用程序的端口号:
const port = process.env.PORT || 3001; app.listen(port);
2. Error: Cannot find module 'xxx'
原因: 模块未安装。 解决方法:
- 安装缺失的模块:
npm install xxx
3. SyntaxError: Unexpected token
原因: 代码中存在语法错误。 解决方法:
- 检查并修复代码中的语法错误。
4. ReferenceError: xxx is not defined
原因: 变量未定义。 解决方法:
- 确保变量在使用前已定义。
5. TypeError: xxx is not a function
原因: 尝试调用一个不是函数的值。 解决方法:
- 检查并确保调用的是函数。
6. Error: Uncaught Exception
原因: 未捕获的异常。 解决方法:
- 添加全局异常处理:
process.on('uncaughtException', (err) => { console.error('There was an uncaught error', err); process.exit(1); // 强制退出进程 });
7. Error: Timeout of Xms
原因: 请求超时。 解决方法:
- 增加请求超时时间:
const server = http.createServer((req, res) => { req.setTimeout(5000, () => { res.statusCode = 408; res.end('Request Timeout'); }); });
8. Error: Memory Limit Exceeded
原因: 内存使用超出限制。 解决方法:
- 增加Node.js的内存限制:
node --max_old_space_size=4096 app.js
9. Error: ENOENT: no such file or directory
原因: 文件或目录不存在。 解决方法:
- 确保文件或目录存在,并检查路径是否正确。
10. Error: Permission denied
原因: 权限不足。 解决方法:
- 确保有足够的权限执行相关操作,例如读取文件或绑定端口。
日志记录工具
为了更好地管理和分析日志,可以使用一些流行的日志记录工具,如:
- Winston: 一个灵活的日志库,支持多种传输方式。
- Morgan: HTTP请求日志中间件。
- Pino: 高性能的日志库。
示例:使用Winston记录日志
const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }), ], }); if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.simple(), })); } // 使用logger记录日志 logger.info('Server is running on port 3000');
通过这些方法和工具,可以有效地诊断和解决Node.js应用程序中的常见日志错误。