Node.js在Linux中的错误处理策略
通过监听Node.js进程的全局事件,捕获未被处理的异常和Promise拒绝,防止应用意外崩溃。
process.on('uncaughtException')捕获同步或异步代码中未处理的异常(如语法错误、运行时错误)。需注意,触发此事件后应用仍处于不稳定状态,建议记录错误日志后安全退出(而非直接重启)。process.on('unhandledRejection')捕获未被.catch()处理的Promise拒绝(如Promise.reject()或async函数中未捕获的throw)。同样需记录日志并采取恢复措施(如重试或降级)。在代码模块中针对具体操作进行错误捕获,避免错误扩散影响整体流程。
try...catch语句包裹可能抛出异常的同步代码(如文件读取、数据库查询),处理明确的可预见错误(如文件不存在、SQL语法错误)。err参数处理错误(如fs.readFile(path, (err, data) => { if (err) throw err; }));.catch()方法或try...catch包裹async函数,处理异步操作中的错误(如网络请求失败、数据库连接超时)。针对Linux下基于事件的模块(如HTTP服务器、EventEmitter),监听error事件以避免进程因未处理的事件错误而退出。
server.on('error', (err) => {})捕获端口占用、网络中断等错误,可记录日志并尝试重启服务。error事件(如emitter.on('error', (err) => {})),防止未处理的事件错误导致进程崩溃。通过结构化日志记录错误详情,便于后续分析与排查问题。
winston-daily-rotate-file插件、Linux自带的logrotate工具),防止日志文件过大占用磁盘空间(如按天分割、保留30天日志)。通过监控工具实时跟踪应用状态,在错误发生时及时通知开发或运维人员。
提升应用的健壮性,降低错误对业务的影响。
cluster模块启动多个工作进程,利用多核CPU提升性能,某个工作进程崩溃不会影响整体服务。从源头减少错误的发生,提升代码的可靠性。
合理管理系统资源,避免资源泄漏导致的性能问题或错误。
fs模块时,及时关闭文件句柄(如fs.readFile完成后调用fs.close),防止文件描述符耗尽。pg-pool for PostgreSQL、mysql2/promise for MySQL)管理数据库连接,设置最大连接数和超时时间,避免连接泄漏。async库(如async.series、async.parallel)管理异步操作的执行顺序和并发量,防止资源竞争。