You need to enable JavaScript to run this app. async/await重构Prometheus代码报TypeError: response.type不是函数求助
优惠活动
大模型
产品
解决方案
定价
更多

async/await重构Prometheus代码报TypeError: response.type不是函数求助

报错核心原因
  • 类型完全不匹配:版本升级后Prometheus.register.metrics()是异步方法,await拿到的resolve值是纯metrics采集内容(字符串/Buffer),根本不是原代码里由h.response()创建的、带有type()等链式方法的响应封装对象。给裸文本调用type()方法,自然触发TypeError。
  • 重构遗漏框架参数:原handler的入参包含框架注入的响应工具h,重构时直接将handler写为无参函数,完全丢失了创建合法响应对象的能力。
正确实现的代码逻辑

重构时要严格区分「采集到的metrics裸数据」和「框架生成的响应对象」两个概念,流程为:

  1. 接收框架传入的req、h两个入参
  2. 异步等待拿到metrics的裸内容
  3. 把裸内容传给h.response()生成带链式方法的合法响应对象
  4. 在合法响应对象上设置contentType
  5. 将最终生成的响应对象返回
handler: async (req, h) => {
    try {
        // 等待拿到异步返回的metrics裸数据,不要把这个值直接当响应对象用
        const metricsContent = await Prometheus.register.metrics()
        // 用框架提供的h方法把裸数据包装为合法响应对象
        const response = h.response(metricsContent)
        // 此时调用type()方法属于合法操作
        response.type(Prometheus.register.contentType)
        return response
    } catch (err) {
        console.log(err)
        // 错误场景生成对应状态的响应,不要直接返回null
        return h.response('Metrics数据采集失败').code(500)
    }
}
重构冗余代码说明
  • 原代码里写的.catch((err) => { throw err; })属于完全无效的冗余逻辑:async函数本身会自动捕获Promise的reject错误并传递到外层try/catch,这段catch转throw的代码不会产生任何实际作用,反而增加无意义的调用栈。
  • 不要在catch分支结束后直接返回null,会导致框架识别不到合法响应触发空指针错误,错误场景必须通过h工具生成对应状态的响应内容。

内容的提问来源于stack exchange,提问作者skphi13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 20:36:04