You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS全局使用中间件报错:构造函数需new调用的问题求解

NestJS全局中间件报错解决方案

报错原因

app.use()是Express/Fastify的原生方法,它只接受函数式中间件。你写的SimpleLoggerMiddleware是实现NestMiddleware的类中间件,类本身是构造函数,直接传入app.use()时,底层会尝试把类当成普通函数调用,而类必须用new关键字实例化才能生成可执行的中间件函数,所以抛出Class constructor cannot be invoked without 'new'错误。

解决方案

方案1:直接实例化类中间件(无依赖注入场景可用)

在bootstrap函数中手动实例化中间件后传入:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 手动实例化类中间件
  app.use(new SimpleLoggerMiddleware());
  await app.listen(3000);
}
bootstrap();

⚠️ 注意:如果你的中间件需要依赖注入(比如注入Logger、数据库服务等),这种方式无法自动处理依赖,不推荐使用。

方案2:通过Nest模块注册(推荐,支持依赖注入)

在根模块(如AppModule)中实现NestModule接口,利用MiddlewareConsumer注册全局中间件,Nest会自动处理实例化和依赖注入:

import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { SimpleLoggerMiddleware } from './middlewares/simple-logger.middleware';

@Module({
  imports: [],
  controllers: [],
  providers: [],
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // 对所有路由应用该中间件
    consumer.apply(SimpleLoggerMiddleware).forRoutes('*');
  }
}

这种方式是Nest官方推荐的类中间件注册方式,完美支持依赖注入,还可以通过forRoutes指定特定路由、控制器,灵活度更高。

方案3:改为函数式中间件(无依赖场景简化写法)

如果中间件不需要依赖注入,可以直接写成函数形式,直接传入app.use():

// 函数式中间件
export function SimpleLoggerMiddleware(req, res, next) {
  console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
  next();
}

然后在bootstrap中直接使用:

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(SimpleLoggerMiddleware);
  await app.listen(3000);
}
bootstrap();

内容的提问来源于stack exchange,提问作者Jack Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:02:46