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 实例来解决上述问题。
const https = require('https'); const keepAliveAgent = new https.Agent({ keepAlive: true, maxSockets: 100 });
通过上述代码,我们创建了一个 keepAliveAgent
实例,使得 https 连接在请求结束后仍然保持连接状态,同时最大并行连接数被设置为 100。
对于 Fastify 应用中的每个请求,我们都需要为其创建独立的 Agent 实例。实现方法如下:
// javascriptcn.com 代码示例 const fastify = require('fastify')(); const https = require('https'); fastify.get('/', async (request, reply) => { const agent = new https.Agent({ keepAlive: true, maxSockets: 100 }); const options = { url: 'https://www.example.com/', https: { agent, }, }; try { const result = await request(options); return result; } catch (err) { reply.send(err); } });
在上述代码中,为了解决 https 请求并行连接数的限制问题,我们改为为每个请求创建独立的 https.Agent 实例。这样就能保持高可用性,避免由于并行连接数限制而导致的请求失败问题。
总结
以上就是解决 Fastify 中 request-promise-native 无法进行 https 请求的问题的方法。通过自定义 Agent 实例来控制最大并行连接数,就能避免由于全局代理导致的请求失败问题。同时,在 Fastify 应用中,在为每个请求创建独立 Agent 实例时,也能有效保持高可用性,提高程序的健壮性。
希望本文对大家有所帮助,同时也欢迎大家在评论区留言分享自己的看法和经验。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654d949a7d4982a6eb6fd9ac