MERN项目Express后端Winston集成Papertrail闲置时报length属性读取错误
问题根因
你遇到的错误是旧版winston-papertrail依赖和Winston 3.x版本不兼容导致的:
- 闲置数小时报错的触发条件是Papertrail的TLS长连接超时断开,旧版
winston-papertrail在处理连接错误的逻辑里,给Winston核心传递了未定义的参数,Winston核心代码尝试访问该参数的length属性就抛出了这个异常。 winston-papertrail已经停止维护多年,仅支持Winston 2.x版本,完全不兼容你当前使用的Winston 3.x API。
解决步骤
1. 替换兼容的Papertrail Transport
卸载废弃的winston-papertrail,换成适配Winston 3.x的维护版本:
npm uninstall winston-papertrail npm install winston-papertrail-transport
2. 修改日志配置代码
调整Papertrail的引入和初始化逻辑:
// 删掉原来的 require("winston-papertrail").Papertrail; 换成下面的引入 const { PapertrailTransport } = require('winston-papertrail-transport'); // 调整transports数组里的Papertrail实例配置 const transports = [ new winston.transports.Console(console), new winston.transports.File({ ...file, colorize: false // 额外修正:文件输出不需要着色,避免写入控制字符乱码 }), new winston.transports.File({ ...error_file, colorize: false // 同上修正 }), // 替换原来的winston.transports.Papertrail new PapertrailTransport({ host: "logs5.papertrailapp.com", port: 32019, handleExceptions: true, flushOnClose: true }) ];
3. 加错误监听兜底
给Papertrail Transport添加独立的错误监听,避免未知错误抛到全局导致进程异常:
const papertrailTransport = new PapertrailTransport({ host: "logs5.papertrailapp.com", port: 32019, handleExceptions: true, flushOnClose: true }); // 捕获Transport自身的错误,不要往上抛 papertrailTransport.on('error', (err) => { console.error('Papertrail日志上传错误:', err); }); // 把实例放到transports数组里 const transports = [ new winston.transports.Console(console), new winston.transports.File({...file, colorize: false}), new winston.transports.File({...error_file, colorize: false}), papertrailTransport ];
内容的提问来源于stack exchange,提问作者QPTR
相关产品推荐
相关产品推荐

