在函数中返回 pom 客户端的实例并从另一个文件访问它会丢失上下文

returning instance of a pom client in a function and accessing it from another file lose context

我有一个打字稿class如下:

const client = require('prom-client');


export default class Monitoring {

  // public client: any;
  private _logger: LoggingService;

  public constructor(logger: LoggingService) {
    // this._pomClient = client;
    this._logger = logger;
  }

  public async executePromClient() {
    this._logger.debug({message: `Returning prom client isnatnce`})
    const histogram = new client.Histogram({
      name: 'http_request_duration_seconds1',
      help: 'Duration of HTTP requests in seconds histogram',
      labelNames: ['method', 'handler', 'code'],
      buckets: [0.1, 5, 15, 50, 100, 500],
    });
    return histogram;
  }

  public async getPromClient() {
    this._logger.debug({message: `Returning prom client isnatnce`})
    return  client;

  }

他的执行函数工作正常,但当我在我的服务器 ts 中调用 getPromClient() 时没有问题,如下所示:

const monitoring = new Monitoring(
  loggingService,
);
// const client = require('prom-client');
const client: any = monitoring.getPromClient();
// enable prom-client to expose default application metrics
const collectDefaultMetrics = client.collectDefaultMetrics;

我明白了

TypeError: collectDefaultMetrics is not a function
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)

我很困惑,我只是返回客户端并尝试在 sercer.ts 中使用 为什么它不起作用?

错过等待?

const client: any = await monitoring.getPromClient();

您将 getPromClient() 声明为 async。这意味着如果你不 await 它会 return 一个 Promise。由于您在 getPromClient() 中没有 await 任何内容,只需删除 async 即可解决问题。

public getPromClient() {
    this._logger.debug({message: `Returning prom client isnatnce`})
    return  client;
}

您可能不知道 async 是什么意思,只是到处声明它,而您不应该这样做。您可以了解更多 here