解决 Fastify 中 request-promise-native 无法进行 https 请求的问题

Fastify 是一个快速和低开销的 Web 框架,而 request-promise-native 是一个 Node.js 模块,用于请求和处理 http 和 https 请求。然而,有时候在使用 Fastify 框架时,我们发现 request-promise-native 无法进行 https 请求。这是为什么呢?如何解决这个问题呢?下面我们一起来探讨。

问题原因

在使用 request-promise-native 发送 https 请求时,其底层使用了 Node.js 内置的 https 模块。而 Node.js 的 https 模块默认情况下使用了一个名为 https.globalAgent 的全局代理,用于初始化 https.Agent 的实例。而这个全局代理只支持最多五个并行连接。当达到这个限制时,后续的 https 请求会等待前面的请求完成,才能继续进行。

在 Fastify 中,如果同时有多个请求需要进行 https 请求,就容易发生上述问题。由于 Fastify 底层使用了 pino 实现日志输出,每次请求都会有大量的日志输出,导致同一个 https Agent 被不同的请求实例共享,最终超过了五个并行连接的限制,从而出现了前面提到的问题。

解决方法

解决这个问题首先要了解一个概念:在 Node.js 中,可以通过配置 Agent 实例中的 maxSockets 来控制最大并行连接数。所以我们可以通过自定义 Agent 实例来解决上述问题。

通过上述代码,我们创建了一个 keepAliveAgent 实例,使得 https 连接在请求结束后仍然保持连接状态,同时最大并行连接数被设置为 100。

对于 Fastify 应用中的每个请求,我们都需要为其创建独立的 Agent 实例。实现方法如下:

在上述代码中,为了解决 https 请求并行连接数的限制问题,我们改为为每个请求创建独立的 https.Agent 实例。这样就能保持高可用性,避免由于并行连接数限制而导致的请求失败问题。

总结

以上就是解决 Fastify 中 request-promise-native 无法进行 https 请求的问题的方法。通过自定义 Agent 实例来控制最大并行连接数,就能避免由于全局代理导致的请求失败问题。同时,在 Fastify 应用中,在为每个请求创建独立 Agent 实例时,也能有效保持高可用性,提高程序的健壮性。

希望本文对大家有所帮助,同时也欢迎大家在评论区留言分享自己的看法和经验。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654d949a7d4982a6eb6fd9ac


纠错
反馈