async/await重构Prometheus代码报TypeError: response.type不是函数求助
报错核心原因
- 类型完全不匹配:版本升级后
Prometheus.register.metrics()是异步方法,await拿到的resolve值是纯metrics采集内容(字符串/Buffer),根本不是原代码里由h.response()创建的、带有type()等链式方法的响应封装对象。给裸文本调用type()方法,自然触发TypeError。 - 重构遗漏框架参数:原handler的入参包含框架注入的响应工具
h,重构时直接将handler写为无参函数,完全丢失了创建合法响应对象的能力。
正确实现的代码逻辑
重构时要严格区分「采集到的metrics裸数据」和「框架生成的响应对象」两个概念,流程为:
- 接收框架传入的
req、h两个入参 - 异步等待拿到metrics的裸内容
- 把裸内容传给
h.response()生成带链式方法的合法响应对象 - 在合法响应对象上设置
contentType - 将最终生成的响应对象返回
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
相关产品推荐
相关产品推荐

