猿问

在 NestJS 微服务中公开普通的 http 端点

我有一个用 NestJs 编写的微服务:


async function bootstrap() {

  const port = parseInt(process.env.PORT || '5000', 10);


  const app = await NestFactory.createMicroservice(ApplicationModule, {

    transport: Transport.TCP,

    options: { host: '0.0.0.0', port }

  });

  app.listen(() => console.log(`Microservice is listening on port ${port}`));

}

bootstrap();

但是现在我需要/metrics为 Prometheus实现一个端点。所以问题是我如何使用 NestJs 微服务来做到这一点


从这个问题我得到的印象是这是不可能的。这是真的吗?如果是这样,是否有我可以使用的解决方法?


我尝试应用中间件如下


Module({

  imports: [],

  controllers: [AppController],

  providers: [AppService, DBService],

})

export class ApplicationModule {

  configure(consumer: MiddlewareConsumer) {

    consumer

      .apply(MetricsMiddleware)

      .forRoutes('/metrics') // Also tried '*'

  }

}

但是当我什么curl http://localhost:5000/metrics都不做时,中间件不会被调用


@Injectable()

export class MetricsMiddleware implements NestMiddleware {

    constructor() {}


    use(req, res, next) {

        console.log('yes');

        next();

    }

}

更新:这个问题也无济于事:(


12345678_0001
浏览 179回答 1
1回答

明月笑刀无情

如果您希望您的应用程序同时支持 http 请求和微服务,您可以创建一个混合应用程序。// Create your regular nest application.const app = await NestFactory.create(ApplicationModule);// Then combine it with your microserviceconst microservice = app.connectMicroservice({  transport: Transport.TCP,  options: { host: '0.0.0.0', port: 5000 }});await app.startAllMicroservicesAsync();await app.listen(3001);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答