You need to enable JavaScript to run this app. Fastify中从authentication返回对象提取token时,GET请求始终挂起的问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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),如果实际请求的地址和配置的地址不匹配,也可能出现路由匹配异常、请求无响应的情况。

修复方案

  1. 调整上下文获取方式
    不要再在独立控制器里依赖this访问挂载的方法,优先从Fastify实例的标准API上获取:
    • 先把authentication方法通过fastify.decorate正式挂载到实例上,不要把它写在脱离实例的独立类里
    • 在控制器里通过req.server.authentication()调用方法,不要用隐式的this绑定
  2. 补全错误处理逻辑
    移除对未定义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
        });
      }
    }
    
  3. 加日志快速定位卡点
    在控制器的第一行、authentication调用前后、return返回前分别加日志,启动服务后发请求,看日志执行到哪一步停住,就能快速定位是上下文拿不到方法,还是authentication方法本身逻辑挂起,或是错误处理时出了问题。

提示:浏览器里请求一直pending,本质是服务端从接收到请求开始,就没有任何代码执行reply.send()把响应写回客户端,自然会一直处于加载等待状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 07:27:03