代码之家  ›  专栏  ›  技术社区  ›  Jeanluca Scaljeri

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

  •  0
  • Jeanluca Scaljeri  · 技术社区  · 5 年前

    我用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 为了普罗米修斯。所以问题是如何使用NestJs微服务

    this 我觉得这是不可能的。这是真的吗?如果是的话,我有没有办法?

    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();
        }
    }
    

    更新: This issue 也无助于:(

    0 回复  |  直到 5 年前
        1
  •  2
  •   Kim Kern    5 年前

    如果希望应用程序同时支持http请求和微服务,可以创建 hybrid application

    // Create your regular nest application.
    const app = await NestFactory.create(ApplicationModule);
    
    // Then combine it with your microservice
    const microservice = app.connectMicroservice({
      transport: Transport.TCP,
      options: { host: '0.0.0.0', port: 5000 }
    });
    
    await app.startAllMicroservicesAsync();
    await app.listen(3001);