尧图精选

Fastify 如何用 serverFactory 接入自定义 HTTP Server?

🕒 发布时间:2026/9/10 22:39:45 📁 来源:尧图网络
Fastify 如何用 serverFactory 接入自定义 HTTP Server【免费下载链接】fastifyFast and low overhead web framework, for Node.js项目地址: https://gitcode.com/GitHub_Trending/fa/fastify如果你需要在 Fastify 之外接管 HTTP 服务器本身——比如自己创建http.Server并在请求到达 Fastify 路由之前做额外处理或者复用外部已经创建好的服务器实例——Fastify 提供了serverFactory选项。它是Fastify()工厂函数 options 对象中的一个属性传进去的是一个函数Fastify 用它替代默认逻辑来生成底层 Node.js HTTP server。本文按文档 docs/Reference/Server.md 中serverFactory一节的说明演示接入方式、验证方法以及启用该选项后哪些 Fastify 选项会失效。serverFactory 的函数契约serverFactory是一个函数接收两个参数并返回一个 server 实例第一个参数handlerFastify 的内部请求处理器它接受 Node.js 原生的request和response对象。你的服务器必须在收到请求时把它转交给这个 handler否则路由、hooks 都不会工作。第二个参数opts就是你传给Fastify()的 options 对象本身仓库测试 test/custom-http-server.test.js 中直接断言了opts.serverFactory存在。返回值一个 server 实例。Fastify 内部使用的是 Node 核心 HTTP server 的 API所以你返回的实例必须暴露同样的 API如果返回的不是标准http.Server可以在return之前对该实例做增强enhance把缺少的 API 补上。TypeScript 类型定义在 types/server-factory.d.ts 中FastifyServerFactoryRawServer描述了这个函数的签名FastifyServerFactoryHandler会根据RawServer是http.Server | https.Server还是http2的 server 决定 handler 的参数类型。类型通过 fastify.d.ts 导出可以直接导入使用。最小可运行示例下面是文档给出的标准接法可直接保存为server-factory-demo.js运行需要一个已安装 fastify 的 Node.js 项目const http require(node:http) const Fastify require(fastify) const serverFactory (handler, opts) { const server http.createServer((req, res) { handler(req, res) }) return server } const fastify Fastify({ serverFactory }) fastify.get(/, (req, reply) { reply.send({ hello: world }) }) fastify.listen({ port: 3000 })要点是http.createServer的回调里只做一件事把原生req、res转交给 Fastify 传入的handler。验证接入是否生效启动后请求根路径期望得到文档示例中的响应体curl http://localhost:3000/ # 示例结果{hello:world}仓库测试 test/custom-http-server.test.js 的验证方式与之对应listen后用fetch请求断言response.status 200且 body 解析后等于{ hello: world }。如果状态码不是 200先检查serverFactory里是否把请求转交给了handler——没有转交的话请求不会进入 Fastify 路由。fastify.server属性返回的就是serverFactory里创建的那个 server 对象文档建议它只用于挂载监听器。测试中用fastify.server.address().port取实际监听端口用fastify.addresses()取监听地址数组都可以作为接入后的检查手段。在请求进入路由前做定制因为请求先经过你的http.createServer回调再进入 Fastify可以在这个位置给原生请求对象挂额外属性。测试文件中的做法是在回调里设置req.custom true然后在路由 handler 中通过request.rawraw指向原生请求对象读取它来验证定制生效serverFactory: (handler, opts) { const server http.createServer((req, res) { req.custom true handler(req, res) }) return server }对 TypeScript 项目类型测试 test/types/serverFactory.tst.ts 演示了更完整的做法定义扩展了http.IncomingMessage/http.ServerResponse的接口在 factory 内给req/res挂方法然后把FastifyServerFactoryhttp.Server类型的函数传给fastifyhttp.Server, CustomIncomingMessage, CustomServerResponse({ serverFactory })这样路由 handler 里的request.raw和reply.raw就能获得这些扩展方法的类型提示。启用 serverFactory 后失效的选项docs/Reference/Server.md中多个选项明确标注 “WhenserverFactoryoption is specified this option is ignored”即指定serverFactory后以下服务器级超时与限制选项会被忽略connectionTimeout默认0无超时keepAliveTimeout默认7200072 秒仅 HTTP/1 生效requestTimeout默认0无限制maxRequestsPerSocket默认0无限制仅 HTTP/1.1 生效原因是这些值本来由 Fastify 在默认创建服务器时设置到 server 实例上见 lib/server.js 中getServerInstance有serverFactory时直接调用它否则才执行server.keepAliveTimeout ...等赋值。改用自定义 server 后这些行为需要你在 factory 内自己设置到返回的实例上文档没有给出替代配置项。行为差异与限制几个仓库测试中确认过的行为接入前需要了解外部创建的 server 不会被 Fastify 关闭。如果serverFactory返回一个由你自己listen的已有实例测试中为serverFactory: () server并外部server.listen(0)fastify.close()不会调用该 server 的close——关闭生命周期由你自己负责。测试断言close()之后server.listening仍为true。forceCloseConnections: idle要求 server 支持closeIdleConnections。当serverFactory返回的实例没有closeIdleConnections方法时Fastify()构造阶段就会抛出FST_ERR_FORCE_CLOSE_CONNECTIONS_IDLE_NOT_AVAILABLE错误信息为 “Cannot set forceCloseConnections to idle as your HTTP server does not support closeIdleConnections method”。复用已有实例时 Fastify 会跳过二级 server 的创建。监听localhost且同时解析出多个地址时Fastify 会为额外地址创建二级 server当serverFactory返回的实例已经处于监听状态时这部分逻辑不再执行即“user defined serverFactory 优先忽略二级 server 创建”。可以继续查看的位置serverFactory与其他工厂选项的完整说明docs/Reference/Server.md类型定义types/server-factory.d.ts行为测试含request.raw定制验证、外部 server 关闭行为、forceCloseConnections抛错test/custom-http-server.test.js、test/types/serverFactory.tst.ts内部如何调用 factorylib/server.js 的getServerInstance【免费下载链接】fastifyFast and low overhead web framework, for Node.js项目地址: https://gitcode.com/GitHub_Trending/fa/fastify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →