Fastify中从authentication返回对象提取token时,GET请求始终挂起的问题求助
Fastify接口请求永久Pending问题排查与修复
核心问题点(按触发概率从高到低排序)
- 上下文丢失导致方法调用直接卡断
你在控制器里直接通过this.authentication()访问方法,但这个控制器是独立从模块导出的普通函数,根本没有和挂载了authentication方法的类实例、Fastify实例做上下文绑定。当this指向为undefined时,这行代码要么直接抛错,要么因为拿不到方法预期的入参,导致authentication方法内部逻辑永久挂起,永远不返回结果,请求自然不会有任何响应。 - 错误处理链路断裂
你的catch块里引用了未定义的boom对象,既没有在文件顶部引入boom依赖,也没有在Fastify全局注册BOOM适配插件。一旦try块里抛出错误进入catch分支,执行boom.boomify(err)会直接触发ReferenceError,这个错误如果没有被正确捕获并回传响应,handler返回的Promise就会处于既不resolve也不被正确处理reject的状态,最终表现为请求一直pending。 - 路由拼写偏差
你配置的路由地址是/api/stream/converstations,属于conversations的拼写错误(少了字母r),如果实际请求的地址和配置的地址不匹配,也可能出现路由匹配异常、请求无响应的情况。
修复方案
- 调整上下文获取方式
不要再在独立控制器里依赖this访问挂载的方法,优先从Fastify实例的标准API上获取:- 先把
authentication方法通过fastify.decorate正式挂载到实例上,不要把它写在脱离实例的独立类里 - 在控制器里通过
req.server.authentication()调用方法,不要用隐式的this绑定
- 先把
- 补全错误处理逻辑
移除对未定义boom对象的依赖,错误直接通过reply对象返回,不要让未捕获的错误中断响应流程,修正后的控制器代码参考:exports.getConversations = async (req, reply) => { try { // 从req.server上拿到挂载的authentication方法,确保上下文正确 const authResult = req.server.authentication(); const { token } = authResult; // 直接通过reply返回结构化结果 return reply.send({ token }); } catch (err) { // 记录错误日志,直接返回500响应 req.log.error(err); return reply.code(500).send({ error: err.message }); } } - 加日志快速定位卡点
在控制器的第一行、authentication调用前后、return返回前分别加日志,启动服务后发请求,看日志执行到哪一步停住,就能快速定位是上下文拿不到方法,还是authentication方法本身逻辑挂起,或是错误处理时出了问题。
提示:浏览器里请求一直pending,本质是服务端从接收到请求开始,就没有任何代码执行
reply.send()把响应写回客户端,自然会一直处于加载等待状态。
内容的提问来源于stack exchange,提问作者Chanrithisak Phok
相关产品推荐
相关产品推荐

