I use NestJS framework, and want to apply several middlewares to a route in my app. Each middleware is a class implementing NestMiddleware interface. One of these middlewares is async, and is not consumed before the route handler is called. Is there a way to resolve the promise of this middleware before handling the route?
My code
Async middleware (page-loader.middleware)
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class PageLoader implements NestMiddleware {
async use(req: any, res: any, next: () => void) {
try {
req.body.html = await req.body.fetcher.fetch();
} catch (error) {
throw new Error(error);
} finally {
next();
}
}
}
Controller (create-article.controller)
import { Controller, Post, Body } from '@nestjs/common';
import { SaveArticleService } from './save-article.service';
import { CreateArticleDto } from './create-article.dto';
@Controller()
export class CreateArticleController {
constructor(private readonly saveArticleService: SaveArticleService) {}
@Post('/create')
async create(@Body() createArticleDto: CreateArticleDto) {
return this.saveArticleService.save(createArticleDto);
}
}
Module (create-article.module)
import { Module, NestModule, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
import { CreateArticleController } from './create-article.controller';
import { SaveArticleService } from './save-article.service';
// Another (sync) middleware
import { ExtensionExtractor } from './extension-extractor.middleware';
// The async middleware
import { PageLoader } from './page-loader.middleware';
@Module({
controllers: [CreateArticleController],
providers: [SaveArticleService],
})
export class CreateArticleModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(ExtensionExtractor, PageLoader)
.forRoutes({ path: 'create', method: RequestMethod.POST});
}
}
I did not include a snippet of the service used in the controller, as it is not relevant to my question.
What I tried
This question did not help me solve the issue, as the middleware structure is different. I am waiting for the middleware method to resolve its promise, and not waiting for an input that is reused inside the middleware.
These github issue answers are not relevant, as the NestJS API drastically changed.
Thanks in advance for your help!