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

发布时间:2026/9/10 22:39:35

Fastify 如何用 serverFactory 接入自定义 HTTP Server? 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),仅供参考
延伸阅读

更多相关文章

2026/9/10 22:39:35

大模型训练服务器选型与配置实战指南

1. 大模型训练服务器的核心需求分析 作为长期从事AI研究的从业者,我经历过从单卡调试到百卡集群训练的全过程。选择训练服务器绝非简单的"买最贵显卡"这么简单,需要综合考虑计算能力、存储性能、网络拓扑和成本效益四大维度。 大模型训练对硬…

2026/9/10 22:39:35

30秒装好 TVBoxOSC:把电视变成大屏文档阅读器

30秒装好 TVBoxOSC:把电视变成大屏文档阅读器 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC TVBoxOSC 是一款电视盒子控制与管理工具…

2026/9/10 22:39:35

毕业论文查重降重工具与策略全解析

1. 毕业论文查重降重现状与痛点解析 2026届毕业生即将面临学术生涯最重要的一道关卡——毕业论文查重。作为过来人,我深知这个过程中的焦虑与压力。目前国内高校普遍采用知网、维普等权威检测系统,查重率一旦超过学校规定的阈值(通常本科15%、…

2026/9/10 23:34:41

RNN系列模型在MNIST手写数字识别中的应用与优化

1. 为什么选择RNN系列模型处理MNIST?MNIST手写数字识别作为深度学习领域的"Hello World",传统解决方案多采用CNN卷积神经网络。但当我们使用RNN、LSTM和GRU这类时序模型来处理这个看似静态的图像分类问题时,背后其实蕴含着几个关键…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码