Вы можете абсолютно использовать асинхронное промежуточное ПО с Nest; Однако существует проблема с использованием стратегии .forRoutes({path: 'path', method: method});
.
Я настроил быстрого потребителя промежуточного программного обеспечения, чтобы показать, как это работает, без использования RequestMethod.GET
.
UserModule (с включенным промежуточным программным обеспечением)
import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
function asyncTimeout(milliseconds: number): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('DONE'), milliseconds);
});
}
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService]
})
export class UserModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply((req, res, next) => {
console.log('Using forRoutes(path)');
console.log('syncronous middleware');
next();
},
(async (req, res, next) => {
console.log('Using forRoutes(path)');
const start = Date.now();
const done = await asyncTimeout(5000);
console.log(done);
console.log('Time taken:' + (Date.now() - start));
next();
})
)
.forRoutes('/')
.apply((req, res, next) => {
console.log('Using forRoutes({path, method})');
console.log('syncronous middleware');
next();
},
(async (req, res, next) => {
console.log('Using forRoutes({path, method})');
const start = Date.now();
const done = await asyncTimeout(5000);
console.log(done);
console.log('Time taken:' + (Date.now() - start));
next();
})
)
.forRoutes({path: '/', method: RequestMethod.GET});
}
}
UserController (Snippet)
import { Controller, Get } from '@nestjs/common';
import { UserSerivce } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get('/')
testFunction() {
return {greeting: 'hello'};
}
}
выход
[2019-06-20 22:40:48.191] [INFO] | Listening at http://localhost:3333/api
Using forRoutes(path)
syncronous middleware
Using forRoutes(path)
DONE
Time taken:5002
[2019-06-20 22:40:57.346] [INFO] | [Nest] 30511 [Morgan] GET /api/user 200 5014.234 ms - 20
Я использовал одни и те же функции промежуточного программного обеспечения в обеих установках, но вы можете видеть, что асинхронное промежуточное программное обеспечение реагирует, как и ожидалось, при использовании .forRoutes(path)
, но не при использовании .forRoutes({path, method})
(простите за мой пользовательский регистратор).
Это должно быть поднято как проблема на GitHub с Kamil, чтобы решить ее, но в противном случае ваша настройка работает. Не стесняйтесь использовать любой мой код здесь, чтобы настроить образец репо для выпуска, если вы решите открыть его.