NestJS中winston-daily-rotate-file报错:TypeError: 不是构造函数
问题原因与解决方案
核心原因
winston-daily-rotate-file从v5版本开始,取消了默认导出,改用命名导出。如果仍然使用默认导入的方式(比如import DailyRotateFile from 'winston-daily-rotate-file'),会得到undefined,实例化时自然会抛出TypeError: ...default is not a constructor。
修复步骤
1. 修正导入方式
根据你的模块系统选择正确的导入写法:
- ES模块(TypeScript/ES6):
import { DailyRotateFile } from 'winston-daily-rotate-file';
- CommonJS(require):
const { DailyRotateFile } = require('winston-daily-rotate-file');
2. 完整NestJS配置示例
以下是集成winston和日志轮转的完整代码参考:
创建winston配置文件(比如src/winston.logger.ts)
import * as winston from 'winston'; import { DailyRotateFile } from 'winston-daily-rotate-file'; export const winstonLogger = winston.createLogger({ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ timestamp, level, message }) => { return `${timestamp} [${level.toUpperCase()}]: ${message}`; }) ), transports: [ // 控制台输出 new winston.transports.Console(), // 每日轮转文件 new DailyRotateFile({ filename: 'logs/app-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: true, // 压缩旧日志 maxSize: '10m', // 单文件最大10MB maxFiles: '7d' // 保留7天日志 }) ] });
在main.ts中使用自定义日志
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { winstonLogger } from './winston.logger'; async function bootstrap() { const app = await NestFactory.create(AppModule, { logger: winstonLogger }); await app.listen(3000); } bootstrap();
3. 确认依赖版本兼容性
检查package.json中的依赖版本,确保:
winston版本为^3.12.0winston-daily-rotate-file版本为^5.0.0
这两个版本是官方兼容的组合,无需降级。
内容的提问来源于stack exchange,提问作者Ohs
相关产品推荐
相关产品推荐

