核心功能
把「一切皆插件」作为组织方式,用 register 按声明顺序异步加载路由与依赖,并用 JSON Schema 同时完成请求校验和响应序列化。适合对吞吐和响应结构有要求的 Node.js 接口服务。
功能亮点
一切皆插件
路由、数据库连接、公共逻辑统统通过 register 注册,加载顺序即声明顺序
校验交给 JSON Schema
在路由 schema.body 里描述字段类型,框架据此拦掉不合法请求,不用手写 if 判断
响应也走 schema
声明 response 结构后序列化快 2–3 倍,且未列入 schema 的字段不会被返回,可防敏感数据外泄
作用域隔离与显式提升
插件内的装饰器默认只在本作用域可见,需要共享时用 fastify-plugin 包一层
启动前先把依赖就绪
异步引导确保数据库等资源加载完成后服务器才开始接受连接
适用场景
• 以 JSON 为主的后端接口服务,用响应 schema 同时提速序列化并控制字段外泄
• 需要按业务边界拆分的中大型服务,借插件封装把各子服务的依赖隔离开
• 启动依赖数据库或外部资源的服务,靠异步引导确保依赖就绪后才对外接受连接
安装配置
bash
安装框架:
npm i fastify
(可选)安装命令行工具:
npm i fastify-cli
使用 fastify-cli 时,在 package.json 中加入:
{
"scripts": {
"start": "fastify start server.js"
}
}
然后用以下命令启动:
npm start使用方法
javascript
// ESM 写法
import Fastify from 'fastify'
const fastify = Fastify({
logger: true
})
// CommonJS 写法
// const fastify = require('fastify')({ logger: true })
// 声明一条路由
fastify.get('/', function (request, reply) {
reply.send({ hello: 'world' })
})
// 启动服务器
fastify.listen({ port: 3000 }, function (err, address) {
if (err) {
fastify.log.error(err)
process.exit(1)
}
})
// 用 JSON Schema 校验请求体
const opts = {
schema: {
body: {
type: 'object',
properties: {
someKey: { type: 'string' },
someOtherKey: { type: 'number' }
}
}
}
}
fastify.post('/', opts, async (request, reply) => {
return { hello: 'world' }
})
// 交给 fastify-cli 启动时,server.js 写成导出的插件函数
// server.js
'use strict'
module.exports = async function (fastify, opts) {
fastify.get('/', async (request, reply) => {
return { hello: 'world' }
})
}关键指标
尚未核验对标产品,此处只列本工具自身指标,不做对比结论。
指标Fastify
价格免费
开源是
上手难度进阶
相关工具
同类工具
优点
- 请求校验与响应序列化都用 JSON Schema 描述,校验规则和接口契约是同一份声明
- 响应 schema 让序列化速度提升 2–3 倍,同时天然过滤掉未声明的字段
- 插件作用域默认隔离,装饰器和钩子不会意外污染全局,要共享时才用 fastify-plugin 显式提升
- 实例化时传 { logger: true } 即得到结构化日志,无需自行接入日志库
缺点
- 「一切皆插件」与作用域封装是必须先理解的前置概念,直接照 Express 的习惯写容易踩坑
- 插件加载顺序会影响可用性,装饰器和钩子的可见范围需要按推荐目录结构组织代码
- 接口契约要额外写一份 JSON Schema,简单接口会显得比手写判断啰嗦