NestJS 中间件未执行
NestJS Middleware Not Executed
从模块连接时,NestJS class 或功能中间件不会 运行。它也不适用于单个路径、控制器或每条路径。从 main.ts 连接功能中间件工作正常。
//main.ts
import { ValidationPipe } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
import { AppModule } from './app.module'
declare const module: any
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())
app.useGlobalPipes(new ValidationPipe())
await app.listen(2100)
if (module.hot) {
module.hot.accept()
module.hot.dispose(() => app.close())
}
}
bootstrap()
//app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'
import { AuthMiddleware } from './middleware/auth.middleware'
import { UserModule } from './user/user.module'
@Module({
imports: [UserModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware)
.forRoutes('(.*)')
}
}
//auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common'
import { FastifyRequest, FastifyReply } from 'fastify'
@Injectable()
export class AuthMiddleware implements NestMiddleware {
use(req: FastifyRequest, res: FastifyReply, next: () => void) {
console.log('test auth middleware')
next()
}
}
预期输出:测试身份验证中间件
实际:无
问题是安装“fastify”包和“@nestjs/platform-fastify”。此外,如果你删除“fastify”包,那么“@nestjs/platform-fastify”包中使用的依赖项也会被删除,因此它不会正常工作。如果您已经安装了这两个软件包,请卸载“fastify”并重新安装“@nestjs/platform-fastify”。
我没有使用 Fastify,但我的中间件甚至没有执行,甚至直接从文档中获取。我构建了我的项目 (npm run build
),然后返回到开发模式 npm run start:dev
,这似乎可行。如有疑问,请调查 /dist
目录。
我也遇到了同样的问题。使用显式控制器时工作正常,但不适用于“*”。
也试过:
forRoutes({path: '*', method: RequestMethod.ALL })
但这似乎也不起作用。
不幸的是,我的解决方案是使用全局功能中间件,如示例 here 所示。
这不是很容易维护,因为它是在 main.ts 而不是 app.module 中定义的。
这导致了 e2e 测试的一些问题,但我最终能够让它工作。只需确保在 main.ts 中以及在为 e2e 测试创建测试模块时使用中间件。
main.ts:
const app = await NestFactory.create(AppModule);
app.use(functionalMiddleware);
在您的端到端测试模块中:
const createAppE2e = async (): Promise<INestApplication> => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
});
const app = moduleRef.createNestApplication();
app.use(functionalMiddleware);
await app.init();
return app;
}
就我而言,我想在全局应用一个中间件,在特定模块级别应用一个中间件。
但是出于某种原因,当您在特定模块级别应用中间件时,中间件不起作用。
export class PartnerModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(ModuleSpecificMiddleware);
}
}
所以我找到了另一种方法。在应用程序模块中,您可以像这样分配它。
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware);
consumer.apply(ModuleSpecificMiddleware).forRoutes(PartnerController); // This was the solution
}
}
从模块连接时,NestJS class 或功能中间件不会 运行。它也不适用于单个路径、控制器或每条路径。从 main.ts 连接功能中间件工作正常。
//main.ts
import { ValidationPipe } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
import { AppModule } from './app.module'
declare const module: any
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())
app.useGlobalPipes(new ValidationPipe())
await app.listen(2100)
if (module.hot) {
module.hot.accept()
module.hot.dispose(() => app.close())
}
}
bootstrap()
//app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'
import { AuthMiddleware } from './middleware/auth.middleware'
import { UserModule } from './user/user.module'
@Module({
imports: [UserModule],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware)
.forRoutes('(.*)')
}
}
//auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common'
import { FastifyRequest, FastifyReply } from 'fastify'
@Injectable()
export class AuthMiddleware implements NestMiddleware {
use(req: FastifyRequest, res: FastifyReply, next: () => void) {
console.log('test auth middleware')
next()
}
}
预期输出:测试身份验证中间件
实际:无
问题是安装“fastify”包和“@nestjs/platform-fastify”。此外,如果你删除“fastify”包,那么“@nestjs/platform-fastify”包中使用的依赖项也会被删除,因此它不会正常工作。如果您已经安装了这两个软件包,请卸载“fastify”并重新安装“@nestjs/platform-fastify”。
我没有使用 Fastify,但我的中间件甚至没有执行,甚至直接从文档中获取。我构建了我的项目 (npm run build
),然后返回到开发模式 npm run start:dev
,这似乎可行。如有疑问,请调查 /dist
目录。
我也遇到了同样的问题。使用显式控制器时工作正常,但不适用于“*”。 也试过:
forRoutes({path: '*', method: RequestMethod.ALL })
但这似乎也不起作用。 不幸的是,我的解决方案是使用全局功能中间件,如示例 here 所示。 这不是很容易维护,因为它是在 main.ts 而不是 app.module 中定义的。 这导致了 e2e 测试的一些问题,但我最终能够让它工作。只需确保在 main.ts 中以及在为 e2e 测试创建测试模块时使用中间件。
main.ts:
const app = await NestFactory.create(AppModule);
app.use(functionalMiddleware);
在您的端到端测试模块中:
const createAppE2e = async (): Promise<INestApplication> => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
});
const app = moduleRef.createNestApplication();
app.use(functionalMiddleware);
await app.init();
return app;
}
就我而言,我想在全局应用一个中间件,在特定模块级别应用一个中间件。 但是出于某种原因,当您在特定模块级别应用中间件时,中间件不起作用。
export class PartnerModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(ModuleSpecificMiddleware);
}
}
所以我找到了另一种方法。在应用程序模块中,您可以像这样分配它。
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthMiddleware);
consumer.apply(ModuleSpecificMiddleware).forRoutes(PartnerController); // This was the solution
}
}